BufferedImage - zmiana koloru

0

Dawno nie pisałem tu tematu.

Tak więc mam obraz BufferedImage wczytany z pliku:

BufferedImage image = ImageIO.read(MojaKlasa.class.getResourceAsStream("/ścieżka/do/pliku/obraz.bmp"));

Jest to obraz dość duży, o wymiarach ~5600x2400 pikseli. Znajduje się na nim mnóstwo różnych kształtów o różnych kolorach. Część z nich powinna zostać przemalowana na kolor niebieski, część na zielony. Mam listę, które kolory (w formacie RGB) mają zmienić się na kolor niebieski, a które na zielony. Łącznie na obrazie użytych jest ponad 2000 różnych kolorów RGB.

Ilość koniecznych do sprawdzenia kombinacji oraz ilość pikseli sprawia, że zabawa w rodzaju "pobierz kolor piksela, sprawdź, zmień kolor piksela) nie wchodzi w rachubę: w ciągu sekundy zdąża przekształcić w ten sposób około 2500 pikseli, a półtorej godziny oczekiwania na taką rzecz to coś idiotycznego, zwłaszcza biorąc pod uwagę to, że dość często może pojawiać się konieczność zaktualizowania tego obrazu.

Znalazłem na SO oraz kilku innych stronach poradę wykorzystania ColorModel w celu zamiany wszystkich pikseli danego koloru na inny kolor, lecz nie mam bladego pojęcia, w jaki sposób to zrobić. Kompletnie nie rozumiem przykładów i zwracam się do was o pomoc z wyjaśnieniem, jak wykorzystać tą klasę do zamiany koloru. A może znacie jakiś lepszy/wydajniejszy sposób?

2

PROBLEM ROZWIĄZANY.
Pomoc dla potomnych i całej reszty, bo każdemu może się przydać:

Tworzymy najpierw taką klasę:

class ColorSwapFilter extends RGBImageFilter {
   private final Color org;
   private final Color dest;
   public ColorSwapFilter(Color org, Color dest) { //każdy piksel w kolorze "org" zostanie zmieniony na "dest"
      this.org = org;
      this.dest = dest;
      this.canFilterIndexColorModel = true;
   }

   @Override
   public int filterRGB(int x, int y, int rgb) {
      if (rgb == org.getRGB()) { //porównaj kolor piksela z kolorem oryginalnym
         return dest.getRGB(); //kolor zostaje zmieniony
      }
      return rgb; //kolor nie jest zmieniony
   }
}

Teraz przetwarzamy obraz:

Image src; //obraz źródłowy
Component comp; //jakiś komponent
ColorSwapFilter csf = new ColorSwapFilter(Color.BLUE, Color.RED); //w obrazie wszystkie niebieskie piksele zostaną zmienione na czerwone
Image img = comp.createImage(new FilteredImageSource(src.getSource(), csf);

Zaraz dorzucę do do artów :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1