Uppgift3f är en frivillig, fortsättning på 3f där du byggde egna filter i en klass som ärvde av ImageFilter. Nu ska vi gå vidare och titta på den färdiga klass som finns i
java.awt.image
. Denna klass som är abstrakt heter RGBImageFilter och det är tänkt att man i en ärvande klass ska sköta själva filteringen i en överskuggning av basklassens:
public int filterRGB(int x, int y, int rgb)
Grundtanken är att såväl in- som utdata förpackas i int rgb, vilket ger oss det inledande problemet med att separera de fyra olika kanalerna. Ett sätt att göra detta är med bit-masker och operatorn & till fyra stycken separata integers enligt:
int alpha = (rgb & 0xFF000000) >> 24;
int red = (rgb & 0x00FF0000) >> 16;
...
Även själva pixelpåverkan går ibland att ordna med bitvis OCH-ning och en passande mask som i:
red = -red & 0xFF;
Detta är ett annat sätt att skapa samma inverteringseffekt som i den föregående uppgiften. Att det blir samma resultat kan du kontrollera i äpplet här nedanför:
gre = -gre & 0xFF;
blu = -blu & 0xFF;
Gråfiltret är i denna applet skapat genom:
red /= 1.2;
gre /= 1.2;
blu /= 1.2;
Förrutom dessa två filter har vi tänkt oss att ni ska bygga några egna tonings- eller effektfilter. Har man bara själva grundmotorn klar så är det sedan lätt att skapa nya filter. Jo, en sak till bör nog nämnas. Du måste skifta in bitarna på plats i den integer som ska returneras. Detta ordnas enklast genom något i stil med:
return r = ((alpha << 24) | (red << 16)| (gre << 8) | blu);