关于j2me透明色图片的处理
2010-01-25 01:33
218 查看
在项目里面经常都会遇到图片透明色或者透明度的处理。
常常会有些概念混淆不清楚,主要是对于创建图片的几个方法。整理了一些资料在这里,个人觉得比较有用:
透明图片的绘制在J2ME中不是通过Graphics的方法调用完成的,而是通过将Image图片对象指定成透明图片对象来完成的。在Image中有一个方法叫createRGBImage(int[] rgb,int width,int height,boolean processAlpha)。这个方法可以创建出一幅具有透明和半透明效果的图片,当这样的图片被绘制在屏幕上的时候,会自动表现为透明或半透明色。但是这个方法产生的图片有一个问题,就是这个图片中的像素颜色是不可变的,也就是说这个对象的getGraphics()不能取得Graphics对象,也就不能通过程序自定义绘制图片。而我们所需要的就是要通过程序来绘制图片并且达到半透明效果。那么怎么办呢?
我们这样来处理,首先我们通过Image的createImage方法来创建一个可变图片,然后绘制自定义的图片数据内容。示例程序如下:
上面程序完成了对自定义图片的像素颜色的提取,在J2ME中的Image是这样规定的,如果这是一个不可变图片,取得的每一个像素颜色是一个int类型的值,如果其高位是00,也就是颜色为0x00RRGGBB的时候,这个像素就是完全透明的,如果是0xAARRGGBB,其中AA表示透明度,这样的颜色表示半透明,现在我们取得了自定义的可变图片的像素颜色值,接下来,我们需要创建不可变图片,并且要把白色的背景设置为完全透明的。
好了,到这里一个透明图片创建出来了,这个图片被绘制到Canvas上将会是一幅背景完全透明的图片。其实这样我们可以对这个功能封装一个方法,代码如下:
更完备的方法:
常常会有些概念混淆不清楚,主要是对于创建图片的几个方法。整理了一些资料在这里,个人觉得比较有用:
透明图片的绘制在J2ME中不是通过Graphics的方法调用完成的,而是通过将Image图片对象指定成透明图片对象来完成的。在Image中有一个方法叫createRGBImage(int[] rgb,int width,int height,boolean processAlpha)。这个方法可以创建出一幅具有透明和半透明效果的图片,当这样的图片被绘制在屏幕上的时候,会自动表现为透明或半透明色。但是这个方法产生的图片有一个问题,就是这个图片中的像素颜色是不可变的,也就是说这个对象的getGraphics()不能取得Graphics对象,也就不能通过程序自定义绘制图片。而我们所需要的就是要通过程序来绘制图片并且达到半透明效果。那么怎么办呢?
我们这样来处理,首先我们通过Image的createImage方法来创建一个可变图片,然后绘制自定义的图片数据内容。示例程序如下:
int w = 32; int h = 24; //创建可变的自定义图片,指定宽度和高度 Image bufImg = Image.createImage(w, h); Graphics g = bufImage.getGraphics(); g.setColor(0xFFFFFF); //使用白色绘制背景 g.fillRect(0, 0, w, h); //绘制需要的图片内容 g.setColor(0xFF0000); g.fillRect(10, 10, 20, 20); //绘制图片完成,现在需要取得图片中的数据内容。 //准备一个数组用来存放像素颜色 int [] imgData = new int[w * h]; //取得像素颜色 bufImg.getRGB(imgData, 0, w * h, 0, 0, w, h);
上面程序完成了对自定义图片的像素颜色的提取,在J2ME中的Image是这样规定的,如果这是一个不可变图片,取得的每一个像素颜色是一个int类型的值,如果其高位是00,也就是颜色为0x00RRGGBB的时候,这个像素就是完全透明的,如果是0xAARRGGBB,其中AA表示透明度,这样的颜色表示半透明,现在我们取得了自定义的可变图片的像素颜色值,接下来,我们需要创建不可变图片,并且要把白色的背景设置为完全透明的。
//将取得的保存在数组中的背景颜色的高位值设置为00 for(int i=0; i<imgData.length; i++) { if(imgData[i] & 0x00FFFFFF == 0x00FFFFFF) { imgData[i] = imgData[i] & 0x00FFFFFF; } } //创建不可变透明图片, 其中最后一个参数表示透明。 Image immutableImg = Image.createRGBImage(imgData, w, h, true);
好了,到这里一个透明图片创建出来了,这个图片被绘制到Canvas上将会是一幅背景完全透明的图片。其实这样我们可以对这个功能封装一个方法,代码如下:
createAlphaImage(Image img, int alphaColor) { int w = img.getWidth(); int h = img.getHeight(); int [] imgData = new int[w * h]; img.getRGB(imgData, 0, w * h, 0, 0, w, h); for(int i=0; i<imgData.length; i++) { if(imgData[i] & alphaColor == alphaColor) { imgData[i] = imgData[i] & alphaColor; } }
更完备的方法:
/*** *创建透明图片方法 * @param originalImg -- 源图象 * @param alphaColor -- 需要透明的颜色 * @return -- 透明后的图片对象 */ public static Image createAlphaImage(Image originalImg, int alphaColor) { short w = (short) originalImg.getWidth(); short h = (short) originalImg.getHeight(); int[] imgData = new int[w * h]; //getRGB(int[] rgbData,int offset,int scanlength,int x,int y,int width,int height) //方法获取象素颜色 originalImg.getRGB(imgData, 0, w, 0, 0, w, h); /* * <透明处理> * 上面程序完成了对自定义图片的像素颜色的提取,在J2ME中的Image是这样规定的,如果这是一个 * 不可变图片,取得的每一个像素颜色是一个int类型的值,如果其高位是00,也就是颜色为 * 0x00RRGGBB的时候,这个像素就是完全透明的,如果是0xAARRGGBB,其中AA表示透明度, * 这样的颜色表示半透明,现在我们取得了自定义的可变图片的像素颜色值,接下来,我们需要 * 创建不可变图片,并且要把白色的背景设置为完全透明的。将取得的保存在数组中的背景颜色的 * 高位值设置为00 */ for (int i = 0; i < imgData.length; i++) { if ( (imgData[i] & alphaColor) == alphaColor) { imgData[i] = imgData[i] & alphaColor; } } return Image.createRGBImage(imgData, w, h, true); }
相关文章推荐
- 关于WEB DYNPRO ABAP 对图片的处理
- android图片显示(一) ———— 关于并发,乱序问题的处理
- PHP图片处理函数 类 (水印图,缩略图)[关于等比例压缩与裁剪压缩]
- J2ME图片半透明处理(使用图片像素)(仅部分手机支持)
- 客户端早会 每日一享(关于需要动态更换图片的接口处理技巧?)
- 关于移动设备上图片处理于滑动的网站
- MFC关于JPG图片显示处理方面记录
- 关于PHP图片处理
- 关于QT图片处理(九宫格图片缩放问题)
- j2me 图片处理大全(有自己写的 有山寨别人的 还有照搬的别人的 )
- 图片颜色处理/ 关于RGB转换YUV的探讨与实现
- 关于相册图片,和拍照图片的处理
- 关于多张图片的上传处理方法
- 关于如何获取剪切板的多个图片处理
- 关于Yii图片处理的一个栗子
- 关于Gridview中使用控件和图片导出到Excel的处理
- (转)关于VC图片透明处理的补充
- j2me图片大小、剪切、透明等处理
- 关于图片处理的一些方法
- liunx下关于图片、视频截图的处理