2013-04-17 7 views
16

アイコンの色を自動的に変更しようとしています。 すべてのアイコンには白い塗りつぶしのレイヤーがあり、他の部分は透明です。ここで は例です。(この場合には、それはちょうどそれが見えるように、グリーン)Javaのpngの不透明部分の色を変更します

icon search

私は、次の操作を実行しようとした:

private static BufferedImage colorImage(BufferedImage image) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 

     for (int xx = 0; xx < width; xx++) { 
      for (int yy = 0; yy < height; yy++) { 
       Color originalColor = new Color(image.getRGB(xx, yy)); 
       System.out.println(xx + "|" + yy + " color: " + originalColor.toString() + "alpha: " 
         + originalColor.getAlpha()); 
       if (originalColor.equals(Color.WHITE) && originalColor.getAlpha() == 255) { 
        image.setRGB(xx, yy, Color.BLUE.getRGB()); 
       } 
      } 
     } 
     return image; 
    } 

私が持っている問題は、そのすべてのピクセルであります私は同じ値を持っています:

32|18 color: java.awt.Color[r=255,g=255,b=255]alpha: 255 

私の結果はちょうど色のついた四角です。 透明でない部分の色のみを変更するにはどうすればよいですか?なぜ、すべてのピクセルが同じアルファ値を持っているのですか?私はそれが私の主な問題だと思う:アルファ値が正しく読み取られていないこと。

答えて

12

問題は、その

Color originalColor = new Color(image.getRGB(xx, yy)); 

破棄全てのアルファ値。代わりに、アルファ値を利用可能にするには、

Color originalColor = new Color(image.getRGB(xx, yy), true); 

を使用する必要があります。

18

なぜ動作しないのですか、わかりませんが、これが行われます。

これは...彼らのアルファ値を維持し、青にこのため

enter image description here

import java.awt.image.BufferedImage; 
import java.awt.image.WritableRaster; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class TestColorReplace { 

    public static void main(String[] args) { 
     try { 
      BufferedImage img = colorImage(ImageIO.read(new File("NWvnS.png"))); 
      ImageIO.write(img, "png", new File("Test.png")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private static BufferedImage colorImage(BufferedImage image) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 
     WritableRaster raster = image.getRaster(); 

     for (int xx = 0; xx < width; xx++) { 
      for (int yy = 0; yy < height; yy++) { 
       int[] pixels = raster.getPixel(xx, yy, (int[]) null); 
       pixels[0] = 0; 
       pixels[1] = 0; 
       pixels[2] = 255; 
       raster.setPixel(xx, yy, pixels); 
      } 
     } 
     return image; 
    } 
} 
+0

感謝をすべてpixlesを変更する:) – 4ndro1d

関連する問題