Tuesday, January 27, 2009

Code: Image Scaling in J2ME


This function scales images using an optimized form of bresenham's formula. You can also add bilinear sampling and such to it but I figured since it's on a cell phone it won't matter much and will also cause it to be slower.







public static Image scaleImage( Image original, int newWidth,

int newHeight) {


int[] rawInput = new int[original.getHeight()


* original.getWidth()];


original.getRGB(rawInput, 0, original.getWidth(), 0, 0,


original.getWidth(), original.getHeight());


int[] rawOutput = new int[newWidth * newHeight];


// YD compensates for the x loop by substracting the width


//back out.


int YD = (original.getHeight() / newHeight)


* original.getWidth() – original.getWidth();


int YR = original.getHeight() % newHeight;


int XD = original .getWidth() / newWidth;


int XR = original.getWidth() % newWidth;


int outOffset = 0;


int inOffset = 0;


for (int y= newHeight, YE= 0, y > 0; y--) {


for (int x= newWidth, XE= 0; x > 0; x--) {


rawOutput[outOffset++] = rawInput[inOffset];


inOffset += XD;


XE += XR;


if (XE >= newWidth) {


XE –= newWidth;


inOffset++;


}


}


inOffset += YD;


YE += YR;


if (YE >= newHeight) {


YE –= newHeight;


inOffset += original.getWidth();


}


}


return Image.createRGBImage(rawOutput, newWidth, newHeight, false);


}


 

1 comment:

Place your comments here...