SVG或Vector基础数据到Shape

时间:2014-02-03 03:05:58

标签: java svg awt

所以我试图创建一个工具,可以将.svg文件类型转换为Java Shape或某种允许我执行.contains(x,y)或.contains(Rectangle2D)的类。但是我一直无法找到任何这样做的方法。我发现这篇文章SVG to Java's Path2d parser这似乎给出了答案,但没有明确说明如何。我看了一下类,看不到我如何加载文件然后将其转换为形状。我最初使用任何类型的图像进行此操作,但事实证明这是不切实际的,而且非常慢。代码:

public static Area toArea(URL url, Color color, int tolerance) {
    return toArea(toBufferedImage(url), color, tolerance);
}

public static Area toArea(Image image, Color color, int tolerance) {
    return toArea(toBufferedImage(image), color, tolerance);
}

/**
 * Creates an Area with PixelPerfect precision
 *
 * @param image
 * @param color The color that is draws the Custom Shape
 * @param tolerance The color tolerance
 * @return Area
 */
public static Area toArea(BufferedImage image, Color color, int tolerance) {
    if (image == null) {
        return null;
    }
    Area area = new Area();
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            Color pixel = new Color(image.getRGB(x, y));
            if (isIncluded(color, pixel, tolerance)) {
                Rectangle r = new Rectangle(x, y, 1, 1);
                area.add(new Area(r));
            }
        }
    }

    return area;
}

public static Area toArea(URL url) {
    return toArea(toBufferedImage(url));
}

public static Area toArea(Image image) {
    return toArea(toBufferedImage(image));
}

public static Area toArea(BufferedImage image) {
    //Assumes Black as Shape Color
    if (image == null) {
        return null;
    }

    Area area = new Area();
    Rectangle r;
    int y1, y2;

    for (int x = 0; x < image.getWidth(); x++) {
        y1 = 99;
        y2 = -1;
        for (int y = 0; y < image.getHeight(); y++) {
            Color pixel = new Color(image.getRGB(x, y));
            //-16777216 entspricht RGB(0,0,0)
            if (pixel.getRGB() == -16777216) {
                if (y1 == 99) {
                    y1 = y;
                    y2 = y;
                }
                if (y > (y2 + 1)) {
                    r = new Rectangle(x, y1, 1, y2 - y1);
                    area.add(new Area(r));
                    y1 = y;
                    y2 = y;
                }
                y2 = y;
            }
        }
        if ((y2 - y1) >= 0) {
            r = new Rectangle(x, y1, 1, y2 - y1);
            area.add(new Area(r));
        }
    }

    return area;
}

private static boolean isIncluded(Color target, Color pixel, int tolerance) {
    int rT = target.getRed();
    int gT = target.getGreen();
    int bT = target.getBlue();
    int rP = pixel.getRed();
    int gP = pixel.getGreen();
    int bP = pixel.getBlue();
    return ((rP - tolerance <= rT) && (rT <= rP + tolerance)
            && (gP - tolerance <= gT) && (gT <= gP + tolerance)
            && (bP - tolerance <= bT) && (bT <= bP + tolerance));
}

public static BufferedImage toBufferedImage(Image image) {
    BufferedImage buffer = new BufferedImage(image.getHeight(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
    buffer.createGraphics().drawImage(image, null, null);
    return buffer;
}

public static BufferedImage toBufferedImage(URL url) {
    try {
        return toBufferedImage(ImageIO.read(url));
    } catch (IOException ex) {
        return null;
    }
}

private ImageShaper() {
}

基本上我正在尝试编写一个函数,可以加载一个存储不规则形状的文件,如蝙蝠侠徽标,然后让它能够运行一个包含函数来查看是否有东西击中它。

0 个答案:

没有答案