Detta är en frivillig laboration där du ska konstruera ett par egna enkla bildfilter. Det första är ett inversfilter där slutresultatet är en negativ bild. Det andra är ett kontrastsänkande gråfilter. Hur det är tänkt att fungera ser du i exemplet här nedanför:
Filtren ska byggas som subklassningar av java.awt.image.ImageFilter
och bilderna ska bearbetas pixel för pixel. Lämpligt för en JPEG-bild
är att använda den variant av ImageFilter.setPixels()
som arbetar med en 32-bitars integer
för varje enskild pixel. Metoden har följande indata:
public void setPixels(int x, int y, int width, int height,
ColorModel model, int[] pixels, int off, int scansize);
Vi behöver inte bry oss speciellt mycket om dessa inparametrar i denna inlupp utan filtreringen sker i huvudsak m h a två stycken int[].
Den ena tjänstgör som en matris där vi kan rada upp alla bildens pixlar i en:
int[] pixie = new int[width * height];
Den andra arrayen har tre delar där vi kan separera varje enskild pixels färgkomponenter enligt:
Algoritmen för ett filter som inverterar en bild till ett negativ blir sedan javakod i stil med:
for(int i = 0; i < width; i++)
for(int j = 0; j < height; j++){
int index = i + (j*scansize) + offset;
compo = model.getComponents(pixels[index], compo, 0);
compo[0] = 255 - compo[0];
compo[1] = 255 - compo[1];
compo[2] = 255 - compo[2];
pixie[index] = (int)model.getDataElement(compo, 0);
}