~540 razy szybciej, niż zmiana każdego piksela oddzielnie

ShookTea

Według przeprowadzonych przeze mnie wcześniej pomiarów, zamiana koloru A na B w obrazie o średnich wymiarach 5600x2400 pikseli może trwać nawet półtorej godziny1 - konieczne jest tam sprawdzenie koloru każdego piksela. Z przedstawionym niżej "sposobem" całość zostaje zmieniona w ciągu ok. 10 sekund1.

Konieczne utworzenie jest klasy filtrującej rozszerzającej abstrakcyjną RGBImageFilter:

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, posiadając obiekt klasy Component oraz obraz źródłowy, możemy przetworzyć 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);

1 kwestie dotyczące prędkości działania zależą oczywiście od wielu czynników, takich jak procesor czy pamięć RAM. Specyfikacja komputera testowego: System Windows 8 64-bit, procesor Intel Core i3, 4 CPU, ~1.4 GHz, 4096 MB RAM

0 komentarzy