web-dev-qa-db-ja.com

2つの画像を結合する

Javaで2つの画像(BufferedImage)をマージする必要があります。透明性がなければ問題にはなりません。ベース画像にはすでにある程度の透明度があります。これをそのままにしておき、2番目の画像である「マスク」を適用します。この2番目の画像には不透明なピクセルはありません。実際、ほぼ完全に透明で、反射のような何らかの「光の効果」を与える透明度の低いピクセルがあります。重要な詳細:グラフィックでこれをスクリーン上で行いたくないので、結果のマージでBufferedImageを取得する必要があります。

誰も私を助けることができますか?ありがとう!

詳細:透明度を維持しながら2つの画像を結合します。これは私がする必要があることです。

注:この JavaでBufferedImageアルファマスクを設定する は、透明度を持つ2つの画像ではうまく処理できないため、必要な処理を行いません。最初の画像の透明度を変更します。

78
GuilhermeA

透明度のある新しいBufferedImageを作成し、その上に他の2つの画像(完全または半透明)をペイントします。これは次のようになります。

Image plus overlay

サンプルコード(画像は「image.png」および「overlay.png」と呼ばれます):

File path = ... // base path of the images

// load source images
BufferedImage image = ImageIO.read(new File(path, "image.png"));
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png"));

// create the new image, canvas size is the max. of both image sizes
int w = Math.max(image.getWidth(), overlay.getWidth());
int h = Math.max(image.getHeight(), overlay.getHeight());
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

// Paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(overlay, 0, 0, null);

// Save as new image
ImageIO.write(combined, "PNG", new File(path, "combined.png"));
172
Peter Walser

具体的な回答はできませんが、ここのJava.awt.AlphaCompositeはあなたの友人です。 2つの画像をマージする方法を完全に制御できます。ただし、使用するのは簡単ではありません。最初にグラフィック理論を少し学ぶ必要があります。

3
Steve McLeod

達成しようとしている効果について詳しくは知らずに、BufferedImageに直接描画することもできます。そのため、画面上でできることはすべて、画像自体で実行できます。

したがって、必要なものが他のものの上に描かれている場合、それは本当に簡単です。基本画像のGraphicsオブジェクトを取得し、その上に他のオブジェクトを描画します。

繰り返しますが、目的の正確な効果によっては、機能しない場合があります。より詳細にすれば、より良いヘルプが得られます。たとえば、これは、他のレスポンダーが言及しているAlphaCompositeのジョブ、またはカスタムImageOp(または既存のImageOpsの組み合わせ)です。

3
PSpeed