手动实现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翻转原理 就是 图片像素从最后一行到第一行依次存储
- 手动实现DrawRegion函数例子
- 算法系列-手动实现atoi函数
- 手动实现.*正则表达式匹配函数
- 利用Android的Matrix类实现J2ME的drawRegion的镜像方法
- 【转】Android Matrix类实现J2ME的drawRegion的镜像方法【新一则】
- Android Matrix类实现J2ME的drawRegion的镜像方法
- 实现函数对象的例子
- 手动杀毒的例子
- C++ 单例模式 拷贝构造函数 手动实现
- 手动启动fabric例子marbles02
- Android内存共享、进程间高性能IO、手动实现 Binder IPC、Aidl例子
- 函数例子
- 函数例子
- 手动实现Vector
- 单链表的手动实现
- 手动实现DataTable。
- 实现手动画线
- 手动实现Gridview分页
- Configuring SonicWALL Firewalls
- BW 数据的浑度挖掘
- Programming MapPoint in .NET
- HTML 4 Bible
- WiFi for the enterprise
- 手动实现DrawRegion函数例子
- 简明 Python 编程规范
- The Security Risk Assessment Handbook: A Complete Guide for Performing Security Risk Assessments
- XML Problem Design Solution
- HASH表原理
- Creating a Web Page in Dreamweaver 8: Visual QuickProject Guide
- 隐藏进程的unit HideProcess
- Windows Server 2003: The Complete Reference
- ffmpeg