Package com.j2medev.image;
Import javax.microedition.lcdui. *;
Public class imageutil {
// Fixed Point Constants Private Static Final Int fp_shift = 13;
Private static final int fp_one = 1 << fp_shift;
Private static final int fp_half = 1 << (fp_shift - 1);
// resampling modes - valid values for the mode parameter of resizeImage () // any other value will default to MODE_BOX_FILTER because of the way the // conditionals are set in resizeImage () public static final int MODE_POINT_SAMPLE = 0;
Public static final int mode_box_filter = 1;
/ ** * getPixels Wrapper for pixel grabbing techniques. I separated this step * into it's own function so that other APIs (Nokia, Motorola, Siemens, * etc.) can easily substitute the MIDP 2.0 API (Image.getRGB ()). * @Param src * The source image whose pixels we are grabbing. * @Return an int Array Containing The Pixels in 32 bit argb format. * / Int [] getpixels (image src) {int w = src.getwidth (); INT H = src.getHeight (); int [] pixels = new int [w * h]; src.getrgb (Pixels, 0, W, 0, 0, W, H); Return Pixels;
/ ** * drawPixels Wrapper for pixel drawing function. I separated this step into * it's own function so that other APIs (Nokia, Motorola, Siemens, etc.) can * easily substitute the MIDP 2.0 API (Image.createRGBImage ()). * * @param pixels * int array containing the pixels in 32 bit ARGB format. * @param w * The width of the image to be created. * @param h * The height of the image to be created. This parameter is * actually superfluous, because it must equal pixels.length / w. * @return The image created from the pixel array. * / Image drawPixels (int [] pixels, int w, int h) {return Image.createRGBImage (pixels, w, h ,} / ** * ResizEIMAGE GETS A Source Image Along with new size for it and resizes * it. * @Param src * the source image. * @Param destw * The new width for the destination image. * @ Param desth * .. The new heigth for the destination image * @param mode * A flag indicating what type of resizing we want to do It * currently supports two type: MODE_POINT_SAMPLE - point sampled * resizing, and MODE_BOX_FILTER - box filtered resizing * (default). * @Return The Resized Image. * / Image ResizeImage (IMAGE SRC, INT DESTW, INT DESTH, INT MODE) {Int srcw = src.getwidth (); int srch = src.getHeight ();
// create pixel arrays int [] destPixels = new int [destW * destH]; // array to hold destination // pixels int [] srcPixels = getPixels (src); // array with source's pixelsif (mode == MODE_POINT_SAMPLE) { // Simple point the destination pixels, Find the matching pixel on // the source and use trice for (int desty = 0; DESTY int [] TMPPIXELS = New Int [destw * srch]; // Temporary Buffer for the // Horizontal Resampling // STEP // Variables to Perform; // Color Extracted from Source Int A, R, G, B; // Separate Channels of the Color Int Count; // Number of Pixels Sampled for Calculating The average // the resampling will be separated into 2 steps for simplicity // the first step will keep the same height and just stretch the // picture horizontally // the second step will take the intermediate result and stretch it // vertically // horizontal resampling For (int y = 0; y // now loop from srcx to srcx2 and add up the value for // each channel DO {argb = srcpixels [srcx y * srcw]; A = ((argb & 0xff000000) >> 24); // alpha channel R = ((Argb & 0x00FF0000) >> 16); // red channel G = ((argb & 0x0000FF00) >> 8); // Green Channel B = (Argb & 0x000000FF); // Blue Channel Count; // count The Pixel srcx; //move on to the next pixel} while (srcx <= srcx2 && srcx y * srcw // recreate color from the aveled channel channel and place it // INTO the TEMPORY BUFFER TMPPIXELS [DESTX Y * DESTW] = ((a << 24) | (r << 16) | (g << 8) | b) }} // Vertical Resampling of the Temporary Buffer (Which Has Been // Horizontally ") System.out.Println (" Vertical Resampling ... "; for (int x = 0; x // Now loop from srcy to srcy2 and add up the value for // each channel DO {argb = tmpixels [x srcy * destw]; A = ((argb & 0xff000000) >> 24); // Alpha Channel R = ((Argb & 0x00FF0000) >> 16); // red channel G = ((argb & 0x0000FF00) >> 8); // Green Channel B = (Argb & 0x000000FF); // Blue Channel Count; // count The Pixel srcy; //move on to the next pixel} while (srcy <= srcy2 && x srcy * destw // recreate color from the aveled channels and place it // INTO THE DESTINATION BUFFER DESTPIXELS [X DESTY * DESTW] = ((a << 24) | (r << 16) | (g << 8) | b) }}} // Return A New Image Created from The Destination Pixel Buffer Return Drawpixels (Destpixels, Destw, Desh); }