2

Java で 4 つの画像を結合する方法を理解するのに苦労しています。各画像を、重複する 20 ピクセルを 50% 結合して結合した画像にコピーしたいと考えています。マージされたイメージに、各イメージの適切な部分のブレンドである 20 ピクセルの境界を与える。

つまり、画像が 20 ピクセルずつブレンドされた 4 つの画像ボックスです。非常に紛らわしいので、画像の幅と高さをどのように使用すればよいかわかりません。

このようなもの。どうやってするの?

ここに画像の説明を入力

4

1 に答える 1

7

すべての情報はAlphaComposite、 、Compositing GraphicsConcatenating Imagesから取得しました。

以下のプログラムを改良しました。と の 2 つの方法を使用しjoinHorizontaljoinVertical画像を結合します。メソッド内では、次のことが起こります

  • 2番目の画像がコピーされますが、重複する部分のみ
  • コピーされた画像はハーフアルファ(透明度)に設定されます
  • 「戻り画像」のキャンバスに、最初の画像が描かれ、続いて重複部分のない2番目の画像が描かれます
  • コピーされたイメージがキャンバスにペイントされます。
  • 画像が返ってきました

両方ではなく 1 つの画像のみをハーフ アルファに設定するのはなぜですか?

透明なガラス窓を想像してください。

ここに画像の説明を入力

ウィンドウの半分が赤で覆われるように、ランダムなポイントを赤くペイントします。次に、赤い点のあるウィンドウを新しいキャンバスとして扱います。

ここに画像の説明を入力

新しい「キャンバス」が青で半分覆われるように、ランダムなポイントを青にペイントします。ウィンドウは完全には覆われません。あなたはまだそれを見通すことができるでしょう。

ここに画像の説明を入力

しかし、最初に窓を赤く塗ってから、半分を青く塗ったとしましょう。これで、半分が青で半分が赤になりますが、まったく透明ではありません。

public class ImageMerger {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedImage img1 = //some code here
        BufferedImage img2 = //some code here
        BufferedImage img3 = //some code here
        BufferedImage img4 = //some code here

        int mergeWidth = 20; // pixels to merge.
        BufferedImage merge =  ImageMerger.joinVertical(
                ImageMerger.joinHorizontal(img1, img2, mergeWidth),
                ImageMerger.joinHorizontal(img3, img4, mergeWidth),mergeWidth);

        //do whatever you want with merge. gets here in about 75 milliseconds

    }

    public static BufferedImage joinHorizontal(BufferedImage i1, BufferedImage i2, int mergeWidth){
        if (i1.getHeight() != i2.getHeight()) throw new IllegalArgumentException("Images i1 and i2 are not the same height");

        BufferedImage imgClone = new BufferedImage(mergeWidth, i2.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D cloneG = imgClone.createGraphics();
        cloneG.drawImage(i2, 0, 0, null);
        cloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
        cloneG.drawImage(i2, 0, 0, null);

        BufferedImage result = new BufferedImage(i1.getWidth() + i2.getWidth() 
                - mergeWidth, i1.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();
        g.drawImage(i1, 0, 0, null);
        g.drawImage(i2.getSubimage(mergeWidth, 0, i2.getWidth() - mergeWidth,
                i2.getHeight()), i1.getWidth(), 0, null);
        g.drawImage(imgClone, i1.getWidth() - mergeWidth, 0, null);

        return result;
    }
    public static BufferedImage joinVertical(BufferedImage i1, BufferedImage i2, int mergeWidth){
        if (i1.getWidth() != i2.getWidth()) throw new IllegalArgumentException("Images i1 and i2 are not the same width");

        BufferedImage imgClone = new BufferedImage(i2.getWidth(), mergeWidth, BufferedImage.TYPE_INT_ARGB);
        Graphics2D cloneG = imgClone.createGraphics();
        cloneG.drawImage(i2, 0, 0, null);
        cloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
        cloneG.drawImage(i2, 0, 0, null);

        BufferedImage result = new BufferedImage(i1.getWidth(), 
                i1.getHeight() + i2.getHeight() - mergeWidth, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();
        g.drawImage(i1, 0, 0, null);
        g.drawImage(i2.getSubimage(0, mergeWidth, i2.getWidth(),
                i2.getHeight() - mergeWidth), 0, i1.getHeight(), null);
        g.drawImage(imgClone, 0, i1.getHeight() - mergeWidth, null);

        return result;
    }

}
于 2013-04-19T05:54:53.793 に答える