1

古い位置から新しい座標にピクセルをコピーすることにより、Java 上の既存の画像に境界線を追加する画像を作成しようとしています。私のソリューションは機能していますが、これを行うためのより効率的/短い方法があるかどうか疑問に思っていました.

 /** Create a new image by adding a border to a specified image. 
 * 
 * @param p
 * @param borderWidth  number of pixels in the border
 * @param borderColor  color of the border.
 * @return
 */
    public static NewPic border(NewPic p, int borderWidth, Pixel borderColor) {
    int w = p.getWidth() + (2 * borderWidth); // new width
    int h = p.getHeight() + (2 * borderWidth); // new height

    Pixel[][] src = p.getBitmap();
    Pixel[][] tgt = new Pixel[w][h];

    for (int x = 0; x < w; x++) {
        for (int y = 0; y < h; y++) {
            if (x < borderWidth || x >= (w - borderWidth) || 
                y < borderWidth || y >= (h - borderWidth))
                    tgt[x][y] = borderColor;
            else 
                tgt[x][y] = src[x - borderWidth][y - borderWidth];

        }
    }

    return new NewPic(tgt);
    }
4

1 に答える 1

2

画面への表示のみが目的であり、実際に画像に境界線を追加するのではなく、画像を境界線付きで画面に表示することが目的である場合、画像を表示しているコンポーネントを境界線で構成できます.

component.setBorder(BorderFactory.createMatteBorder(
                                4, 4, 4, 4, Color.BLACK));

黒で描かれた 4 ピクセル (各エッジ) の境界線が表示されます。

ただし、意図が実際に画像を再描画することである場合は、各行配列を取得し、ByteBuffer を使用して行配列 (および境界要素) を一括put(...)操作でコピーし、ByteBuffer 全体を取得することでアプローチします。イメージに戻すための配列としてのコンテンツ。

これによりパフォーマンスに違いが生じるかどうかは不明です。結果のコードが実際には遅くなる可能性があるため、この最適化の試行の前後でベンチマークを行ってください。

主な問題は、システムの配列関数を使用すると、配列の内容を一括でコピーして埋めることができますが、目的の配列のオフセットにそれを行うためのユーティリティが提供されないことです。ただし、NIO パッケージの Buffers を使用すると、これを非常に簡単に行うことができます。そのため、解決策が存在する場合、それは NIO ByteBuffer に含まれているか、または類似しています。

于 2013-03-12T16:09:02.037 に答える