2013-04-17 57 views
16

我正在嘗試自動更改一組圖標的顏色。 每個圖標都有一個白色填充圖層,另一個圖標是透明的。 下面是一個例子:(在這種情況下,它是綠色的,只是爲了使其可見)更改Java中不透明部分的顏色

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 

所以我的結果只是一個彩色方塊。 如何才能實現只更改不透明部件的顏色?爲什麼所有像素都具有相同的alpha值?我想這是我的主要問題:沒有正確讀取alpha值。

回答

12

的問題是,即

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

丟棄所有的α值。相反,您必須使用

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

保持alpha值可用。

18

爲什麼它不起作用,我不知道,這會。

這改變了一切pixles藍,維護他們的alpha值...

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

感謝這個:) – 4ndro1d