J2me图片缩放
分享下着图片缩放的方法,不过暂时无法支持所有机型,低端机还是有待考证。估计内存吃不消...
像NOKIA N7610 这个手机上使用这个方法,图片就是一个素色区域,无法正常显示。
便于理解PS下:手机上Image其实就是一个像素一个像素的话上去,理解这个就不难想到其相关的方法的原理了。
Java代码
- /**
- *
- * @param src
- * 需要变换的图片 图片变换比例 scales1:scales2
- * @param scales1
- * 新图片
- * @param scales2
- * 旧图片
- * @return
- */
- public Image scaleImage(Image src, int scales1, int scales2) {
- return transImage(src, src.getWidth() * scales1 / scales2, src
- .getHeight()
- * scales1 / scales2);
- }
- /**
- *
- * @param src
- * 需要变换的图片
- * @param w
- * 要变换的宽
- * @param h
- * 要变化的高
- * @return
- */
- public Image transImage(Image src, int w, int h) {
- int srcW = src.getWidth();// 图片的宽度
- int srcH = src.getHeight();// 图片的高度
- int dstW = w, dstH = h;
- Image tmp = Image.createImage(dstW, srcH); // 申请个宽为dstW高为srcH的图片空间
- Graphics g = tmp.getGraphics();
- int scale = 16;
- int delta = (srcW << scale) / dstW;// 扫描长度
- int pos = delta / 2;// 扫描位置
- for (int x = 0; x < dstW; x++) {
- g.setClip(x, 0, 1, srcH);
- g.drawImage(src, x - (pos >> scale), 0, Graphics.LEFT
- | Graphics.TOP);
- pos += delta;
- }
- Image dst = Image.createImage(dstW, dstH);
- g = dst.getGraphics();
- delta = (srcH << scale) / dstH;
- pos = delta / 2;
- for (int y = 0; y < dstH; y++) {
- g.setClip(0, y, dstW, 1);
- g.drawImage(tmp, 0, y - (pos >> scale), Graphics.LEFT
- | Graphics.TOP);
- pos += delta;
- }
- return dst;
- }
J2ME 渐变色的处理方法
基于MIDP2.0 CLDC1.0。是我自己一直在用的一个方法,基本机型都是支持的。只要在paint调用即可
Java代码
- private static int[] retrieveRGBComponent(int color) {
- int[] rgb = new int[3];
- rgb[0] = (color & 0x00ff0000) >> 16;
- rgb[1] = (color & 0x0000ff00) >> 8;
- rgb[2] = (color & 0x000000ff);
- return rgb;
- }
- private static int[] generateTransitionalColor(int color1, int color2,
- int steps) {
- int[] color1RGB = retrieveRGBComponent(color1);
- int[] color2RGB = retrieveRGBComponent(color2);
- if (steps < 3 || color1RGB == null || color2RGB == null)
- return null;
- int[] colors = new int[steps];
- colors[0] = color1;
- colors[colors.length - 1] = color2;
- steps = steps - 2;
- int redDiff = color2RGB[0] - color1RGB[0];
- int greenDiff = color2RGB[1] - color1RGB[1];
- int blueDiff = color2RGB[2] - color1RGB[2];
- // from the second to the last second.
- for (int i = 1; i < colors.length - 1; i++) {
- colors[i] = generateFromRGBComponent(new int[] {
- color1RGB[0] + redDiff * i / steps,
- color1RGB[1] + greenDiff * i / steps,
- color1RGB[2] + blueDiff * i / steps });
- }
- return colors;
- }
- private static int generateFromRGBComponent(int[] rgb) {
- if (rgb == null || rgb.length != 3 || rgb[0] < 0 || rgb[0] > 255
- || rgb[1] < 0 || rgb[1] > 255 || rgb[2] < 0 || rgb[2] > 255)
- return 0xfffff;
- return rgb[0] << 16 | rgb[1] << 8 | rgb[2];
- }
- /**
- *
- * @param g
- * @param x
- * 起始X
- * @param y
- * 起始Y
- * @param width
- * 宽度
- * @param height
- * 高度
- * @param TransStart
- * 渐变开始颜色
- * @param TransEnd
- * 渐变结束颜色
- */
- public void drawSelectedBackground(Graphics g, int x, int y, int width,
- int height, int TransStart, int TransEnd) {
- // 这样写是从左到右渐变
- // int[] line = generateTransitionalColor(TextShade, TransEnd, width);
- // Image lineImg = Image.createRGBImage(line, line.length, 1, false);
- // for (int i = 0; i < height; i++) {
- // g.drawImage(lineImg, x, y + i, Graphics.LEFT | Graphics.TOP);
- // }
- // 下面的写法是从上到下渐变
- int[] line = generateTransitionalColor(TransStart, TransEnd, height);
- Image lineImg = Image.createRGBImage(line, 1, line.length, false);
- for (int i = 0; i < width; i++) {
- g.drawImage(lineImg, x + i, y, Graphics.LEFT | Graphics.TOP);
- }
- }