3

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()メソッドがボタンの境界線を描画するのにかかる時間もかなり長い時間になります(ただし、形状の描画に必要な時間よりも短くなります)。これは、上記のクラスによって生成された形状が塗りつぶされており、空。Ellipse2Dなどのjava2dを使用して図形を描画しようとしましたが、ボタンのレンダリングにかかる​​時間はごくわずかです。この分野の経験者なら誰でも、BufferedImageの境界となる形状を生成する方法を教えてくれますか?上記のクラスを使用して、背景が透明なPNG画像から形状を作成します。

4

1 に答える 1

5

ヒントについては、ギザギザのパスのスムージングを参照してください。(粗い)アウトラインを取得するためのアルゴリズムは、最終バージョンでは比較的高速でした。の作成は、オブジェクト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);
}
于 2012-06-01T11:02:59.437 に答える