Java examples for 2D Graphics:BufferedImage Scale
Scales image using bilinear interpolation.
import java.io.InputStream; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.Sprite; public class Main{ /**//from w ww. j a va 2s.c o m * Scales image using bilinear interpolation. Best suited for up scaling. * @return Returns scaled image */ private static Image bilinearInterpolation(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]; int oWidth = original.getWidth(); int[] oX16 = new int[newWidth]; int max = (oWidth - 1) << 4; for (int newX = 0; newX < newWidth; newX++) { oX16[newX] = ((((newX << 1) + 1) * oWidth) << 3) / newWidth - 8; if (oX16[newX] < 0) { oX16[newX] = 0; } else if (oX16[newX] > max) { oX16[newX] = max; } } int oHeight = original.getHeight(); int[] oY16 = new int[newHeight]; max = (oHeight - 1) << 4; for (int newY = 0; newY < newHeight; newY++) { oY16[newY] = ((((newY << 1) + 1) * oHeight) << 3) / newHeight - 8; if (oY16[newY] < 0) { oY16[newY] = 0; } else if (oY16[newY] > max) { oY16[newY] = max; } } int[] oX = new int[2]; int[] oY = new int[2]; int[] wX = new int[2]; int[] wY = new int[2]; int outWeight, outColorWeight, outAlpha, outRed, outGreen, outBlue; int w, argb, a, r, g, b; for (int newY = 0; newY < newHeight; newY++) { oY[0] = oY16[newY] >>> 4; wY[1] = oY16[newY] & 0x0000000f; wY[0] = 16 - wY[1]; oY[1] = wY[1] == 0 ? oY[0] : oY[0] + 1; for (int newX = 0; newX < newWidth; newX++) { oX[0] = oX16[newX] >>> 4; wX[1] = oX16[newX] & 0x0000000f; wX[0] = 16 - wX[1]; oX[1] = wX[1] == 0 ? oX[0] : oX[0] + 1; outWeight = 0; outColorWeight = 0; outAlpha = 0; outRed = 0; outGreen = 0; outBlue = 0; for (int j = 0; j < 2; j++) { for (int i = 0; i < 2; i++) { if (wY[j] == 0 || wX[i] == 0) { continue; } w = wX[i] * wY[j]; outWeight += w; argb = rawInput[oX[i] + oY[j] * original.getWidth()]; a = (argb >>> 24); if (a == 0) { continue; } w = a * w; outColorWeight += w; r = (argb & 0x00ff0000) >>> 16; g = (argb & 0x0000ff00) >>> 8; b = argb & 0x000000ff; outRed += w * r; outGreen += w * g; outBlue += w * b; } } if (outColorWeight > 0) { outAlpha = outColorWeight / outWeight; outRed = outRed / outColorWeight; outGreen = outGreen / outColorWeight; outBlue = outBlue / outColorWeight; } rawOutput[newX + newY * newWidth] = (outAlpha << 24) | (outRed << 16) | (outGreen << 8) | outBlue; } } return Image.createRGBImage(rawOutput, newWidth, newHeight, true); } }