聊聊Android图像格式类及图像转换方法
来源:互联网 发布:妈妈知道软件下载 编辑:程序博客网 时间:2024/06/07 12:10
本文主要介绍Android图像格式类及图像转换方法,一款软件的开发和图像密切相关,特别是移动应用程序,在视觉效果、用户的体验效果等方面是至关重要的,在Android程序开发的过程中,了解存在哪些图像格式类(ImageFormat、PixelFormat及BitmapConfig等)及图像格式(JPG、PNG及BMP等)的转换方法,对以后的开发会有些帮助。
关于图像格式类,介绍以下三个:ImageFormat、PixelFormat及BitmapConfig。
1、ImageFormat(android.graphics.ImageFormat),格式参数有以下几种:
int JPEG ,Encoded formats,常量值: 256 (0x00000100)
int NV16,YCbCr format, used for video,16 (0x00000010)
int NV21,YCrCb format used for images, which uses the NV21 encoding format,常量值: 17 (0x00000011)
int RGB_565,RGB format used for pictures encoded as RGB_565,常量值: 4 (0x00000004)
int UNKNOWN, 常量值:0 (0x00000000)
int YUY2,YCbCr format used for images,which uses YUYV (YUY2) encoding format,20 (0x00000014)
int YV12,Android YUV format,This format is exposed to software decoders and applications
YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes
解释总是英文的最通俗易懂,这里就不献丑翻译了。
用法举例,在构建ImageReader类的对象时,会用到ImageFormat类的图像格式对象。如
<span style="font-size:14px;"> ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.RGB_565, 2);</span>imageReader对象表示其缓存中最多存在宽高分别为width和height、RGB_565格式的图像流两帧。
在需求中用哪一种图像格式,要视实际情况而定,后面的类似。
2、PixelFormat(android.graphics.PixelFormat),格式参数有以下几种:
int A_8,常量值:8 (0x00000008)
int JPEG,常量值:256 (0x00000100),constant,已声明不赞成使用,use ImageFormat.JPEG instead.
int LA_88,常量值:10 (0x0000000a)
int L_8, 常量值:9 (0x00000009)
int OPAQUE,常量值: -1 (0xffffffff),System chooses an opaque format (no alpha bits required)
int RGBA_4444,常量值:7 (0x00000007)
int RGBA_5551,常量值:6 (0x00000006)
int RGBA_8888,常量值:1 (0x00000001)
int RGBX_8888,常量值:2 (0x00000002)
int RGB_332,常量值:11 (0x0000000b)
int RGB_565,常量值:4 (0x00000004)
int RGB_888,常量值:3 (0x00000003)
int TRANSLUCENT,常量值: -3 (0xfffffffd),System chooses a format that supports translucency (many alpha bits)
int TRANSPARENT,常量值:-2 (0xfffffffe),System chooses a format that supports transparency (at least 1 alpha bit)
int UNKNOWN,常量值: 0 (0x00000000)
int YCbCr_420_SP,常量值:17 (0x00000011),constant 已声明不赞成使用 use ImageFormat.NV21 instead
int YCbCr_422_I,常量值: 20 (0x00000014),constant 已声明不赞成使用 use ImageFormat.YUY2 instead
int YCbCr_422_SP,常量值:16 (0x00000010),constant 已声明不赞成使用 use ImageFormat.NV16 instead
注意,有四种图像格式已被声明不赞成使用,可以用ImaggFormat相对应的格式进行代替。由此可知,两种图像格式之间存在相通之处。
用法举例,让窗口实现渐变的效果,如:
<span style="font-size:14px;"> 1 getWindow().setFormat(PixelFormat.RGBA_8888);</span>注意说明:RGBA_8888为android的一种32位颜色格式,R、G、B、A分别用八位表示,Android默认的图像格式是PixelFormat.OPAQUE,其是不带Alpha值的。
3、Bitmap.Config(Android.graphics.Bitmap内部类)
Possible bitmap configurations。A bitmap configuration
describes how pixels are stored。This affects the quality (color
depth) as well as the ability to display transparent/translucent
colors。(官网介绍,大致意思是说:影响一个图片色彩色度显示质量主要看
位图配置,显示图片时透明还是半透明)。
ALPHA_8:Each pixel is stored as a single translucency (alpha) channel。(原图的每一个像素以半透明显示)
ARGB_4444:This field was deprecated in API level 13。 Because of the poor quality of thisconfiguration, it is advised to use ARGB_8888 instead。(在API13以后就被弃用了,建议使用8888)。
ARGB_8888 :Each pixel is stored on 4 bytes。 Each channel
(RGB and alpha for translucency) is stored with 8 bits of precision
(256 possible values) 。This configuration is very flexible and
offers the best quality。 It should be used whenever possible。
(每个像素占4个字节,每个颜色8位,反正很清晰,看着很舒服)。
RGB_565:Each pixel is stored on 2 bytes and only the RGB
channels are encoded:red is stored with 5 bits of precision (32
possible values),green is stored with 6 bits of precision (64
possible values) and blue is stored with 5 bits of precision。(这个应该很容易理解了)。
用法举例,构建Bitmap对象时,会用到BitmapConfig类图像格式对象,如:
<span style="font-size:14px;"> 1 Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565)</span>
下面来看各种类型图像之间的转换都有哪些方法、差异及共同点:
1、YUV转JPG
查阅到的资料大部分是把Yuv图像数据通过数学运算得到每个像素点的
RGB编码,存入Bitmap对象,再调用Bitmap类自带的压缩方法生成JPG图片。
这种方法效率极低,一张480x320分辨率的图片有20万个字节,因此运算需要
经过20万次循环。其实android.graphics包下面有一个YuvImage类,可以将数据直接导入:
<span style="font-size:14px;">1 YuvImage image = new YuvImage(data, ImageFormat.NV21, IMG_WIDTH, IMG_HEIGHT, null);</span>前面两个参数决定了数据源与图像格式,后面单个参数就不解释了。
而YuvImage类正好有一个compressToJPEG(Rect rect, int i, OutputStream)方法,可以直接将数据保存在JPG文件的输出流中。
2、PNG转Bitmap
<pre name="code" class="java"><span style="font-size:14px;"> 1 byte[] data = null; 2 File pngImage = null; 3 BufferedOutputStream stream = null; 4 try { 5 pngImage = new File(outputFile); //outputFile为png图像名称 6 FileOutputStream fstream = new FileOutputStream(pngImage); 7 stream = new BufferedOutputStream(fstream); 8 stream.write(data); 9 } catch (Exception e) {10 e.printStackTrace();11 } finally {12 if (stream != null) {13 try {14 stream.close();15 } catch (IOException e) {16 e.printStackTrace();17 }18 }19 }20 Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);</span>
如果通过资源(drawable)的形式,那就方便地多,只需要一句话。
<span style="font-size:14px;">1 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);</span>虽然没有华丽的算法,但效果不错哦,就是想改变图像属性时得另外实现。
3、ARGB转Bitmap
<span style="font-size:14px;"> 1 Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length); 2 Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); 3 if(bitmapNew == null) 4 return; 5 for(int i = 0;i<bitmapNew.getWidth();i++) 6 { 7 for(int j =0;j<bitmapNew.getHeight();j++) 8 { 9 int col = bitmapNew.getPixel(i, j); 10 int alpha = col&0xFF000000; 11 int red = (col&0x00FF0000)>>16; 12 int green = (col&0x0000FF00)>>8; 13 int blue = (col&0x000000FF); 14 int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11); 15 int newColor = alpha|(gray<<16)|(gray<<8)|gray; 16 } 17 } 18 sendMsg(bitmapNew); 19 File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg"); 20 OutputStream out; 21 try { 22 out = new FileOutputStream(file); 23 if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out)) 24 out.close(); 25 } catch (FileNotFoundException e) { 26 e.printStackTrace(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } </span>
注意,代码中做了灰度处理,若想得到彩色图,分别对Bitmap图像R、G、B三通道进行赋值即可。
- 聊聊Android图像格式类及图像转换方法
- Android图像格式类及图像转换方法
- 利用OpenCV修改图像大小,转换图像格式
- 图像格式转换
- 图像格式转换
- 图像格式转换
- 转换图像格式
- 图像格式转换
- 图像格式转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与 BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与 BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- Python图像处理库PIL中图像格式转换(一)
- Python图像处理库PIL中图像格式转换(二)
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- oracle模式结构外模式、模式和内模式
- POJ1061-青蛙的约会
- CSS3画各种常见的图形
- Android Material Design 简单控件
- 微信api退款及退款查询
- 聊聊Android图像格式类及图像转换方法
- 学习态度
- 人见人爱A^B(HDU2035)
- 51nod 最长回文子串 V2(Manacher算法)
- 单片机--ds1302
- C++复习(2)派生类成员的标志与访问
- 文件输入/输出
- Android开发项目经验
- 为什么Java中1000==1000为false而100==100为true?