2013-04-17 22 views
16

Próbuję automatycznie zmienić kolor dla zestawu ikon. Każda ikona ma białą wypełnioną warstwę, a druga część jest przezroczysta. Oto przykład: (w tym przypadku jest to zielony, tak aby był on widoczny)Zmiana koloru nieprzejrzystych części png w Javie

icon search

Starałem się wykonać następujące czynności:

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; 
    } 

problem to fakt, że każdy piksel Otrzymuję tę samą wartość:

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

Mój wynik to po prostu kolorowy kwadrat. Jak mogę dokonać zmiany koloru tylko nieprzezroczystych części? Dlaczego wszystkie piksele mają tę samą wartość alfa? Myślę, że to mój główny problem: że wartość alfa nie jest poprawnie czytana.

Odpowiedz

12

Problemem jest to, że

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

odrzuca wszystkie wartości alfa. Zamiast tego należy użyć wartości

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

, aby zachować dostępne wartości alfa.

18

Dlaczego to nie działa, nie wiem, to będzie.

Zmienia wszystkie pixles na niebiesko, utrzymanie ich wartości alfa ...

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

Dzięki za to :) – 4ndro1d