2010-03-03 14 views
5

Zastanawiam się, czy istnieje bardziej wydajna metoda zastępowania kolorów w obrazie BufferedImage. W tej chwili używam następującej metody:Jak wymienić kolory w BufferedImage w JAVA

Wypełniam tablicę kolorami do zastąpienia oraz kolorami, które mają zastąpić, w tym przezroczystością. Następnie przechodzę przez każdy piksel w obrazie. Jeśli pasuje do jednego z kolorów w tablicy, zastępuję go nowym kolorem z tablicy. Oto kod:

Graphics2D g2; 
    g2 = img.createGraphics(); 
    int x, y, i,clr,red,green,blue; 

    for (x = 0; x < img.getWidth(); x++) { 
    for (y = 0; y < img.getHeight(); y++) { 

     // For each pixel in the image 
     // get the red, green and blue value 
     clr = img.getRGB(x, y); 
     red = (clr & 0x00ff0000) >> 16; 
     green = (clr & 0x0000ff00) >> 8; 
     blue = clr & 0x000000ff; 

     for (i = 1; i <= Arraycounter; i++) { 
     // for each entry in the array 
     // if the red, green and blue values of the pixels match the values in the array 
     // replace the pixels color with the new color from the array 
     if (red == Red[i] && green == Green[i] && blue == Blue[i]) 
     { 
      g2.setComposite(Transparency[i]); 
      g2.setColor(NewColor[i]); 
      g2.fillRect(x, y, 1, 1); 
     } 
     } 
    } 

ilustracje ja pracuję są małe, 20x20 pikseli lub więcej. Niemniej wydaje się, że musi to być skuteczniejszy sposób.

+0

Może, jeśli wyjaśnisz pierwotny problem, który możemy pomóc, więcej. – medopal

+0

Kod tworzy obrazy, które będą używane jako legenda na mapie. Mamy zestaw szablonów obrazów w czterech kolorach. czarny, czerwony, zielony i niebieski. W zależności od reprezentacji tematycznej na mapie, obrazy szablonów muszą mieć poprawny kolor. Czarny zostanie przekonwertowany na kolor tła, czerwony, właściwy kolor obramowania, zielony wzór haszy i niebieskie obszary staną się przezroczyste. – Rene

Odpowiedz

10

Zamiast zmieniać wartość pikseli obrazu, można zmodyfikować podstawowy model ColorModel. Znacznie szybszy w ten sposób i nie ma potrzeby powtarzania całego obrazu, aby był on skalowalny.

+1

'ColorMap' nie jest klasą w Java API. Jak on ma to zrobić? – uckelman

+2

To był literówka (która została już naprawiona), głosowanie w dół wydaje się nieco surowe. – objects

+0

Technika ta działa dobrze, wykorzystała ją do przeglądania obrazów medycznych, gdzie kontrast obrazu musiał być regulowany w czasie rzeczywistym. Zmiana pojedynczych wartości pikseli jest zbyt powolna. – objects

3

Użyj HashMap<Color,Color>. Klucz powinien być oryginalnym kolorem, a wartość zastąpieniem. Jeśli wynik get zwraca zero, nie rób nic.

3

Wygląda na to, że idiomatycznym sposobem jest wykonanie LookupOp, a następnie zastosowanie tej operacji w celu utworzenia nowego celu BufferedImage. Jest świetna odpowiedź here.

+0

Co muszę zrobić, to przekonwertować czerwone, zielone, niebieskie i czarne piksele na ich własny nowy kolor. Czy można to zrobić za pomocą LookupOp? Wydaje się, że działa na każdy składnik koloru indywidualnie. – Rene

+0

Nie użyłem tego, ale jestem pewien, że to możliwe. Patrząc na odpowiedź, którą przytaczam, wydaje się, że LookupTable (skonstruowana z tablicą 2D) służy do mapowania kolorów źródłowych do docelowych. Sprawdź metodę LookupTable LookupPixel ... Jestem prawie pewien, że to właśnie zostanie wywołane, zazwyczaj z 4-elementową tablicą src zawierającą wartości RGBA (powinieneś to sprawdzić). – Adamski

Powiązane problemy