爪哇 - 从周围的图像边界创建形状(Java - Create a shape from borde

2019-06-25 08:24发布

我有一个从PNG图像绘制的形状,这样我可以用形状来绘制的,我需要为我的项目自定义按钮边框的类。 这里的类来绘制图像的形状的代码:

public class CreateShapeClass {
    public static Area createArea(BufferedImage image, int maxTransparency) {
        Area area = new Area();
        Rectangle rectangle = new Rectangle();
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                int rgb = image.getRGB(x, y);
                rgb = rgb >>> 24;
                if (rgb >= maxTransparency) {
                    rectangle.setBounds(x, y, 1, 1);
                    area.add(new Area(rectangle));
                }
            }
        }
        return area;
    }
}

然而,这需要很长的时间来处理,我认为,通过预拉伸在我的主要应用的形状,然后将它们存储到一个数组,并传递给其他类,它会降低渲染时间。 然而,所用的时间为给paintBorder()方法来绘制出边界的按钮需要一个相当长的时间太(虽然比以绘制形状所需要的时间短),因为由类所产生的形状的上方填充并且不空。 我试图绘制使用Java2D的形状,例如,Ellipse2D的,并且按钮的渲染只需要很短的时间。 任何人在这一领域的经验可以教我如何生成的形状是一个BufferedImage的边界? 我使用上面的类具有透明背景创建从PNG图像的形状。

Answer 1:

对于提示,看看平滑锯齿路径。 获得的(粗)轮廓算法是在最后的版本相对较快。 创建GeneralPath是令人惊讶的不是追加更快Area对象。

最重要的部分是这样的方法:

public Area getOutline(Color target, BufferedImage bi) {
    // construct the GeneralPath
    GeneralPath gp = new GeneralPath();

    boolean cont = false;
    int targetRGB = target.getRGB();
    for (int xx=0; xx<bi.getWidth(); xx++) {
        for (int yy=0; yy<bi.getHeight(); yy++) {
            if (bi.getRGB(xx,yy)==targetRGB) {
                if (cont) {
                    gp.lineTo(xx,yy);
                    gp.lineTo(xx,yy+1);
                    gp.lineTo(xx+1,yy+1);
                    gp.lineTo(xx+1,yy);
                    gp.lineTo(xx,yy);
                } else {
                    gp.moveTo(xx,yy);
                }
                cont = true;
            } else {
                cont = false;
            }
        }
        cont = false;
    }
    gp.closePath();

    // construct the Area from the GP & return it
    return new Area(gp);
}


文章来源: Java - Create a shape from border around image