~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