package uk.co.mmscomputing.image.operators;
import java.awt.image.*;
import java.awt.color.*;
import java.util.*;
public class GrayScale extends Operator{
private BufferedImage grayscale(BufferedImage image){
/*
Grayscale: the java way
*/
if(image.getType()==BufferedImage.TYPE_BYTE_GRAY){ return image; }
int imageType = BufferedImage.TYPE_BYTE_GRAY;
int w=image.getWidth();
int h=image.getHeight();
BufferedImage newImg=new BufferedImage(w,h,imageType);
ColorSpace srcSpace=image.getColorModel().getColorSpace();
ColorSpace newSpace=newImg.getColorModel().getColorSpace();
ColorConvertOp convert=new ColorConvertOp(srcSpace,newSpace,null);
convert.filter(image,newImg);
return newImg;
}
private BufferedImage grayscale2(BufferedImage src){
/*
Grayscale: by hand
*/
int w=src.getWidth();
int h=src.getHeight();
int size=w*h;
WritableRaster swr=src.getRaster();
DataBuffer sdb=swr.getDataBuffer();
BufferedImage dest=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY);
WritableRaster dwr=dest.getRaster();
DataBuffer ddb=dwr.getDataBuffer();
int x, y, rgb, r, g, b, gr;
for(int i=0; i<size; i++){
rgb=sdb.getElem(i);
r=(rgb>>>16)&0xFF;
g=(rgb>>>8)&0xFF;
b=rgb&0xFF;
gr=((r*77+g*151+b*28)>>>8)&0xFF; // 0.3 x red + 0.59 x green + 0.11 x blue
ddb.setElem(i,gr);
}
return dest;
}
public BufferedImage filter(BufferedImage src){
return grayscale(src);
}
}