web-dev-qa-db-ja.com

画像の不透明度の変更

プロジェクトで、画像のサイズ変更と不透明度の変更を同時に行いたい。これまでのところ、サイズ変更はしていると思います。そのように定義されたメソッドを使用して、サイズ変更を実行します。

public BufferedImage resizeImage(BufferedImage originalImage, int type){

    initialWidth += 10;
    initialHeight += 10;
    BufferedImage resizedImage = new BufferedImage(initialWidth, initialHeight, type);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, initialWidth, initialHeight, null);
    g.dispose();

    return resizedImage;
} 

このコードはここから取得しました。解決策が見つからないのは、不透明度を変更することです。それが私がどうやってやるのか疑問に思っていることです(可能であれば)。前もって感謝します。

[〜#〜] update [〜#〜]

このコードを使用して、内側と外側が透明な円の画像(下の画像を参照)が成長し、不透明度が低くなるのを表示しようとしましたが、機能しませんでした。何が悪いのかわかりません。すべてのコードはアニメーションと呼ばれるクラスにあります

public Animation() throws IOException{

    image = ImageIO.read(new File("circleAnimation.png"));
    initialWidth = 50;
    initialHeight = 50;
    opacity = 1;
}

public BufferedImage animateCircle(BufferedImage originalImage, int type){

      //The opacity exponentially decreases
      opacity *= 0.8;
      initialWidth += 10;
      initialHeight += 10;

      BufferedImage resizedImage = new BufferedImage(initialWidth, initialHeight, type);
      Graphics2D g = resizedImage.createGraphics();
      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
      g.drawImage(originalImage, 0, 0, initialWidth, initialHeight, null);
      g.dispose();

      return resizedImage;

}

私はそれをこのように呼びます:

Animation animate = new Animation();
int type = animate.image.getType() == 0? BufferedImage.TYPE_INT_ARGB : animate.image.getType();
BufferedImage newImage;
while(animate.opacity > 0){

    newImage = animate.animateCircle(animate.image, type);
    g.drawImage(newImage, 400, 350, this);

}
11
pasawaya

まず、メソッドに渡すタイプに次のようなアルファチャネルが含まれていることを確認します。

BufferedImage.TYPE_INT_ARGB

次に、新しい画像をペイントする直前に、次のようにGraphics2DメソッドsetCompositeを呼び出します。

float opacity = 0.5f;
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));

これにより、描画の不透明度が50%に設定されます。

23
tommo