3

私は2つ持っていRenderedImagesます。これら 2 つの画像を処理したいOverlay Operationので、データ型とバンド数を一致させる必要があります。
私が抱えている問題は、1 つの画像に 3 つのバンド (RGB) があり、2 番目の画像に 4 つのバンド (ARGB) があることです。

私の質問は、アルファチャンネルを最初の画像に追加して、次のことができるようにするにはどうすればよいOverlay Operationですか?

編集
OK、最初の画像にアルファチャンネルを追加する方法を見つけました。以下はコードです。単一のバンド定数イメージを作成し、それを最初のイメージとマージしました。

ParameterBlock pb = new ParameterBlock();
pb.add(new Float(finalImage.getWidth())).add(new Float(finalImage.getHeight()));
pb.add(new Byte[] {new Byte((byte)0xFF)});
RenderedImage alpha = JAI.create("constant", pb);

finalImage = BandMergeDescriptor.create(finalImage, alpha, null);

私が今抱えている問題は、オーバーレイを追加するたびに画像の色が変わることです。全ての色が赤やピンクのニュアンスになります。2 番目のオーバーレイを追加すると、画像は再び正常になりますが、最初のオーバーレイの色が変わります。すべての黒い領域が白になります。

また、オーバーレイの背景は透明ではありません。灰色です。

以下は画像の例です。色がどのように変化するかがわかります。

原画

最初のオーバーレイを追加した後

2 番目のオーバーレイを追加した後

ご覧のとおり、画像とオーバーレイの色が変わり、オーバーレイの背景が透明ではなくなります。

画像が常に正しく表示されるように、この問題を解決するのを手伝ってもらえますか? ありがとう!

4

2 に答える 2

0

通常は TYPE_INT_ARGB の BufferedImages を使用するため、TYPE_4BYTE_ARGB についてはわかりませんが、RGB BufferedImage を新しい ARGB BufferedImage に描画し、それを他のものに問題なく描画する方法をよく使用しました。色の変化は、特定の画像に固有のものではないように見えるため、オーバーレイ プロセスで他のチャネルに不要な変更が加えられていることを示しています。オーバーレイ操作がアルファを使用してある画像を別の画像に描画することに似ている場合は、オーバーレイ自体に Graphics.drawImage()/drawRenderedImage() メソッドを使用することをお勧めします。

コード:

public RenderedImage overlay(RenderedImage back, RenderedImage front, AffineTransform overlayTransformation)
{

    BufferedImage newBack = new BufferedImage(back.getWidth(), back.getHeight(), TYPE_3BYTE_RGB);
    newBack.setData(back.getData());
    Graphics2D graphics = (Graphics2D)(newBack.getGraphics());
    graphics.drawRenderedImage(front, overlayTransformation);
    return newBack;

}

ただし、元のバック Raster が変更されていないことを確認したい場合があります。

于 2015-11-22T04:20:25.897 に答える
0

ARGB モデルを使用して新しい BufferedImage を作成し、不透明な背景画像をこの新しい BufferedImage にペイントするだけです。次に、アルファ チャネルを持つ BufferedImage があるので (すべてのピクセルは不透明ですが)、Composition がうまく機能するはずです。

于 2014-11-18T08:54:07.857 に答える