2009-03-20 14 views
24

私はこれをウェブで検索していますが、まともなヘルプが見つかりませんでした。BufferedImageで色を透明にしてPNG形式で保存する方法

ImageIOで読み込んだBufferedImageがあります。今私は透明にそのイメージの特定の色を作り、PNGとしてイメージを保存したいと思います。

明らかな理由から透明色を「塗りつぶす」ことができないので、何らかのフィルタが必要であると推測しています。

誰でもこれのためのサンプルコードがありますか?

答えて

39

私は最近、私のプロジェクトマネージャの質問に答えるためにそれをしました。透明性灰色変換
関数である:

private Image TransformGrayToTransparency(BufferedImage image) 
    { 
    ImageFilter filter = new RGBImageFilter() 
    { 
     public final int filterRGB(int x, int y, int rgb) 
     { 
     return (rgb << 8) & 0xFF000000; 
     } 
    }; 

    ImageProducer ip = new FilteredImageSource(image.getSource(), filter); 
    return Toolkit.getDefaultToolkit().createImage(ip); 
    } 

実際には、グレーレベル画像に作用するので、私はわずかに同一である他のものを廃棄、アルファへのRGB成分(R 1)をコピー私の場合。
特定の色をフィルタリングすることができます。等価性や範囲などのテストを行います。
もちろん、BufferedImageはBufferedImage.TYPE_INT_ARGB型である必要があります。

私は保存の問題に対処していませんが、それはかなり簡単ですが、このコードページも追加できます。 BufferedImageに画像を変換するには

[EDIT]:クリストファーは彼の完全なソリューションを投稿が、ここでは私のものです後

BufferedImage dest = new BufferedImage(
    imageWidth, imageHeight, 
    BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2 = dest.createGraphics(); 
g2.drawImage(image, 0, 0, null); 
g2.dispose(); 

[EDIT 2]私が来て、私は透明色の範囲を作成する方法を示しています。改善することができます。代わりにHSBコンポーネントを使用します。

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.awt.image.FilteredImageSource; 
import java.awt.image.ImageFilter; 
import java.awt.image.ImageProducer; 
import java.awt.image.RGBImageFilter; 
import java.io.*; 

import javax.imageio.ImageIO; 

public class AddTransparency 
{ 
    AddTransparency() throws IOException 
    { 
    String imagePath = "E:/Documents/images/"; 
    File inFile = new File(imagePath, "map.png"); 
    BufferedImage image = ImageIO.read(inFile); 

    Image transpImg1 = TransformGrayToTransparency(image); 
    BufferedImage resultImage1 = ImageToBufferedImage(transpImg1, image.getWidth(), image.getHeight()); 

    File outFile1 = new File(imagePath, "map_with_transparency1.png"); 
    ImageIO.write(resultImage1, "PNG", outFile1); 

    Image transpImg2 = TransformColorToTransparency(image, new Color(0, 50, 77), new Color(200, 200, 255)); 
    BufferedImage resultImage2 = ImageToBufferedImage(transpImg2, image.getWidth(), image.getHeight()); 

    File outFile2 = new File(imagePath, "map_with_transparency2.png"); 
    ImageIO.write(resultImage2, "PNG", outFile2); 
    } 

    private Image TransformGrayToTransparency(BufferedImage image) 
    { 
    ImageFilter filter = new RGBImageFilter() 
    { 
     public final int filterRGB(int x, int y, int rgb) 
     { 
     return (rgb << 8) & 0xFF000000; 
     } 
    }; 

    ImageProducer ip = new FilteredImageSource(image.getSource(), filter); 
     return Toolkit.getDefaultToolkit().createImage(ip); 
    } 

    private Image TransformColorToTransparency(BufferedImage image, Color c1, Color c2) 
    { 
    // Primitive test, just an example 
    final int r1 = c1.getRed(); 
    final int g1 = c1.getGreen(); 
    final int b1 = c1.getBlue(); 
    final int r2 = c2.getRed(); 
    final int g2 = c2.getGreen(); 
    final int b2 = c2.getBlue(); 
    ImageFilter filter = new RGBImageFilter() 
    { 
     public final int filterRGB(int x, int y, int rgb) 
     { 
     int r = (rgb & 0xFF0000) >> 16; 
     int g = (rgb & 0xFF00) >> 8; 
     int b = rgb & 0xFF; 
     if (r >= r1 && r <= r2 && 
      g >= g1 && g <= g2 && 
      b >= b1 && b <= b2) 
     { 
      // Set fully transparent but keep color 
      return rgb & 0xFFFFFF; 
     } 
     return rgb; 
     } 
    }; 

    ImageProducer ip = new FilteredImageSource(image.getSource(), filter); 
     return Toolkit.getDefaultToolkit().createImage(ip); 
    } 

    private BufferedImage ImageToBufferedImage(Image image, int width, int height) 
    { 
    BufferedImage dest = new BufferedImage(
     width, height, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = dest.createGraphics(); 
    g2.drawImage(image, 0, 0, null); 
    g2.dispose(); 
    return dest; 
    } 

    public static void main(String[] args) throws IOException 
    { 
    AddTransparency at = new AddTransparency(); 
    } 
} 
+0

Hi PhiLho。それはあなたが今、http://stackoverflow.com/questions/266486/in-java-how-do-you-write-a-java-awt-image-bufferedimage-to-an-8-bit-pngに答えることができるということですか? -file?または、これらの2つの質問は無関係ですか? – VonC

+0

画像が表示されますが、ImageIO.writeで画像を保存することはできません。 ImageをBufferedImageに変換する必要がありますか? もっと簡単な方法が必要です。 – corgrath

+0

イメージの保存方法に関するサンプルコードがある場合、またはイメージでできる他の魅力的なものがあれば、素晴らしいでしょう。 – corgrath

16

私のデモアプリケーションの完全なソリューションはここにあります。

public static void main(String[] args) throws Exception { 

     File in = new File("C:\\Users\\Christoffer\\Desktop\\christoffer.jpg"); 
     BufferedImage source = ImageIO.read(in); 

     int color = source.getRGB(0, 0); 

     Image image = makeColorTransparent(source, new Color(color)); 

     BufferedImage transparent = imageToBufferedImage(image); 

     File out = new File("C:\\Users\\Christoffer\\Desktop\\trans.PNG"); 
     ImageIO.write(transparent, "PNG", out); 

    } 

    private static BufferedImage imageToBufferedImage(Image image) { 

     BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = bufferedImage.createGraphics(); 
     g2.drawImage(image, 0, 0, null); 
     g2.dispose(); 

     return bufferedImage; 

    } 

    public static Image makeColorTransparent(BufferedImage im, final Color color) { 
     ImageFilter filter = new RGBImageFilter() { 

      // the color we are looking for... Alpha bits are set to opaque 
      public int markerRGB = color.getRGB() | 0xFF000000; 

      public final int filterRGB(int x, int y, int rgb) { 
       if ((rgb | 0xFF000000) == markerRGB) { 
        // Mark the alpha bits as zero - transparent 
        return 0x00FFFFFF & rgb; 
       } else { 
        // nothing to do 
        return rgb; 
       } 
      } 
     }; 

     ImageProducer ip = new FilteredImageSource(im.getSource(), filter); 
     return Toolkit.getDefaultToolkit().createImage(ip); 
    } 
+0

素晴らしい。あなたはPhiLhoの答えを "公式"として選択するべきです(少なくとも彼にアップフォートを与えてください)。 – VonC

+0

良いですが、自分のデモコードを掲載しました。 – PhiLho

+0

完了。私はフィールスの答えを正しいものと選んだと思う。 – corgrath

関連する問題