手动实现DrawRegion函数例子

来源:互联网 发布:淘宝货款多久到账 编辑:程序博客网 时间:2024/04/29 07:47

有朋友在Nokia有些机子上出现翻转问题,关于DrawRegion的方法在网上也没有搜到什么有价值的文章,于是今天周末闲着没事就研究了一下DrawRegion方法,并自己手动实现DrawRegion方法的翻转等等。。。。如果大家有什么好的实现方法,可以留个言给我个链接我也学习学习。

 

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.*;

/*
 create time: 2008-8-31 Administrator
 */

public class TestDrawRegion extends MIDlet {
 TestCanvas canvas;

 public static Display display;

 public TestDrawRegion() {
  canvas = new TestCanvas();
 }

 protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
  // TODO Auto-generated method stub

 }

 protected void pauseApp() {
  // TODO Auto-generated method stub

 }

 protected void startApp() throws MIDletStateChangeException {
  // TODO Auto-generated method stub
  display.getDisplay(this).setCurrent(canvas);
 }

}

class TestCanvas extends Canvas {

 int[] newdata;

 boolean USE_DRAW_RGB = false;

 protected void paint(Graphics g) {
  g.setColor(0xffffff);
  g.fillRect(0, 0, getWidth(), getHeight());
  g.setColor(0x000000);
  g.drawString("Test System Region:", 2, 2, g.LEFT | g.TOP);
  try {
   Image img = Image.createImage(getClass().getResourceAsStream(
     "icon.png"));
   if (img != null)
    testDrawRegion(img, g);
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

 // trans in WTK
 // TRANS_NONE 0 //无翻转
 // TRANS_MIRROR_ROT180 1 //X翻转+180度翻转 即是Y翻转
 // TRANS_MIRROR 2 //X 翻转
 // TRANS_ROT180 3 //顺时针180度翻转 即是XY翻转

 // TRANS_MIRROR_ROT270 4 //X翻转+270度翻转
 // TRANS_ROT90 5 //顺时针90度翻转
 // TRANS_ROT270 6 //270度翻转
 // TRANS_MIRROR_ROT90 7 //X翻转+90度翻转

 public void testDrawRegion(Image img, Graphics g) {

  // 用系统方法来画图,自动实现翻转
  int trans = 0;
  int LINE_SPACE = 60;
  for (int i = 0; i < 2; i++) {
   for (int j = 0; j < 4; j++)
    g.drawRegion(img, 0, 0, 24, 24, trans++, 2 + LINE_SPACE * j, 20
      + LINE_SPACE * i, g.LEFT | g.TOP);
  }

  // 手动实现图片翻转
  g.drawString("use drawrgb Region:", 2, 120, g.LEFT | g.TOP);
  if (img == null)
   return;
  int width = img.getWidth();
  int height = img.getHeight();
  int[] data = new int[width * height];
  newdata = new int[width * height];
  img.getRGB(data, 0, width, 0, 0, width, height);

  trans = 0;
  for (int i = 0; i < 2; i++) {
   for (int j = 0; j < 4; j++) {
    switch (trans) {
    case 0:
     g.drawRGB(data, 0, width, 2 + LINE_SPACE * j, 140
       + LINE_SPACE * i, width, height, true);
     break;
    case 1: // Y翻转
     trans_MIRROR_ROT180(data, width, height);
     break;
    case 2: // X 翻转
     trans_MIRROR(data, width, height);
     break;
    case 3: // XY翻转
     trans_ROT180(data, width, height);
     break;
    case 4:
     trans_MIRROR_ROT270(data, width, height);
     break;
    case 5:
     trans_TRANS_ROT90(data, width, height);
     break;
    case 6:
     trans_ROT270(data, width, height);
     break;
    case 7:
     trans_MIRROR_ROT90(data, width, height);
     break;
    default:
     break;
    }

    if (USE_DRAW_RGB) {
     g.drawRGB(newdata, 0, width, 2 + LINE_SPACE * j, 140
       + LINE_SPACE * i, width, height, true);
    } else {
     Image tempImg = Image.createRGBImage(newdata, width,
       height, true);
     g.drawImage(tempImg, 2 + LINE_SPACE * j, 140 + LINE_SPACE
       * i, g.LEFT | g.TOP);
    }
    trans++;
   }
  }
 }

 // X翻转
 public void trans_MIRROR(int[] data0, int width, int height) {

  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i = row * width; // 该行第一个像素在数据中的偏移量
    newdata[i + col] = data0[(i + width) - col - 1]; // 本行前面的像素和后边的像素对调
   }
  }
 }

 // Y翻转
 public void trans_MIRROR_ROT180(int[] data0, int width, int height) {
  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i, j;
    i = row * width; // 要调换行的第一个像素 偏移量
    j = (height - row - 1) * width; // 对应掉换行的行第一个像素 偏移量

    newdata[i + col] = data0[j + col];
   }
  }
 }

 // XY翻转
 public void trans_ROT180(int[] data0, int width, int height) {
  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i, j;
    i = row * width;
    j = (height - row - 1) * width;

    newdata[i + col] = data0[(j + width) - col - 1];
   }
  }
 }

 public void trans_MIRROR_ROT270(int[] data0, int width, int height) {
  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i, j;
    i = col * height;
    j = row * width;

    newdata[i + row] = data0[j + col];
   }
  }
 }

 public void trans_TRANS_ROT90(int[] data0, int width, int height) {
  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i, j;
    i = col * height;
    j = row * width;

    newdata[i + height - row - 1] = data0[j + col];
   }
  }
 }

 public void trans_ROT270(int[] data0, int width, int height) {
  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i, j;
    i = height * (width - 1 - col);
    j = row * width;
    newdata[i + row] = data0[j + col];
   }
  }
 }

 public void trans_MIRROR_ROT90(int[] data0, int width, int height) {
  for (int row = 0; row < height; row++) {
   for (int col = 0; col < width; col++) {
    int i, j;
    i = height * (width - 1 - col);
    j = row * width;
    newdata[i + height - 1 - row] = data0[j + col];
   }
  }
 }
}

 

注:其实用的最多的就是X翻转,Y翻转,XY翻转。

    X翻转原理 就是 每行的像素都是从最后一个依次往前面存储

    Y翻转原理 就是   图片像素从最后一行到第一行依次存储