2011-09-13 7 views
1

A非常によく似た質問になって作る:How to make a color transparent in a BufferedImage and save as PNGのBufferedImageに特定の色が回答されている透明

は、残念ながら私はそのソースから自分のために答えを策定ことができませんでした。

Q:私は私のキャンバスにBufferedImageを描画し、単に特定の色を有するすべてのピクセルをオンにする方法作成したい(この場合は[214、127、255]/0xD67FFF)透明に1。 BufferedImageはARGB型です。

BufferedImageをファイルとして保存したくない場合は、キャンバスに表示するだけです。

ありがとうございます。

答えて

4

すべてのピクセルに反復処理を行い、チェックを行い透明にします。

for (int y = 0; y < image.getHeight(); ++y) { 
    for (int x = 0; x < image.getWidth(); ++x) { 
     int argb = image.getRGB(x, y); 
     if ((argb & 0x00FFFFFF) == 0x00D67FFF) 
     { 
       image.setRGB(x, y, 0); 
     } 
    } 
} 

BufferedImageがアルファチャンネルを使用していることを確認してください。さもなければ、それは黒くなります。
これは元の画像に影響することに注意してください。

編集:チェックを変更しました。そのため、あなたのピクセルが固体である(α= 255)と仮定しているので、うまくいきませんでした。完全なソリューションのために


(0xFFD67FFF & 0x00FFFFFF) will result in 0x00D67FFF 
And, (0x00D67FFF == 0x00D67FFF) 
+0

これは動作しません。 'System.out.println(Integer.toHexString(argb)) 'を使ってピクセルの色をチェックすると、00d67fffではなくffd67fffが返されます。 (アルファ値は255で0ではないと私は推測しています) 私はあなたの 'if'条件をよく理解していないと思います。 – Acidic

+0

はい、確かです。そのため、私はマスクを使っています( '&'を使って)。この方法では、RGB(アルファではない)のみをチェックしています。この場合、アルファは問題ではありません。それは動作していないと確信していますか? –

+0

さて、私はそれをとにかくできるようにしようとしましたが、無駄にしました。私は 'if(argb == 0xffD67FFF)image.setRGB(x、y、0x00000000);'のように 'if'条件を変更することでこれを動作させました。 これは望ましい効果をもたらすようです。ありがとう。 – Acidic

0

、ロード、処理および書き込みのように、あなたはこのコードを使用することができます:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class TransparentConverter { 

    private static final Color backColor = Color.GREEN; 
    private static final int THRESHOLD = 70; 
    private static final int TRANSPARENT = 0; // 0x00000000; 

    static File base = new File("C:\\images"); 
    static File base2 = new File("C:\\images2"); 

    public static void main(String[] args) throws IOException { 
     System.out.println("TransparentConverter.main()"); 

     for (File file : base.listFiles()) { 
      System.out.println(file); 
      BufferedImage initImage = ImageIO.read(file); 
      int width = initImage.getWidth(null), 
       height = initImage.getHeight(null); 

      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
      Graphics g = image.getGraphics(); 
      g.drawImage(initImage, 0, 0, null); 

      //System.out.println("before: " + image.getRGB(0, 0)); 
      for (int y = 0; y < height; y++) { 
       for (int x = 0; x < width; x++) { 
        int pixel = image.getRGB(x, y); 
        Color color = new Color(pixel); 

        int dr = Math.abs(color.getRed() - backColor.getRed()), 
         dg = Math.abs(color.getGreen() - backColor.getGreen()), 
         db = Math.abs(color.getBlue() - backColor.getBlue()); 

        if (dr < THRESHOLD && dg < THRESHOLD && db < THRESHOLD) { 
         image.setRGB(x, y, TRANSPARENT); 
        } 
       } 
      } 
      //System.out.println(" after: " + image.getRGB(0, 0)); 

      file = new File(base2, file.getName()); 
      //System.out.println(" " + file); 
      ImageIO.write(image, "png", file); 
     } 
    } 
} 
関連する問題