热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android程序开发如何处理图像格式类及图像转换

这篇文章主要介绍了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类的图像格式对象。如

代码如下:

ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.RGB_565, 2);

  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相对应的格式进行代替。由此可知,两种图像格式之间存在相通之处。用法举例,让窗口实现渐变的效果,如

代码如下:

getWindow().setFormat(PixelFormat.RGBA_8888);

  补充说明: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 this configuration, 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类图像格式对象,如:

代码如下:

Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565)

  下面来看各种类型图像之间的转换都有哪些方法、差异及共同点。

  1、YUV转JPG

  查阅到的资料大部分是把Yuv图像数据通过数学运算得到每个像素点的RGB编码,存入Bitmap对象,再调用Bitmap类自带的压缩方法生成JPG图片。这种方法效率极低,一张480x320分辨率的图片有20万个字节,因此运算需要经过20万次循环。其实android.graphics包下面有一个YuvImage类,可以将数据直接导入:

YuvImage image = new YuvImage(data, ImageFormat.NV21, IMG_WIDTH, IMG_HEIGHT, null);
  前面两个参数决定了数据源与图像格式,后面单个参数就不解释了。

  而YuvImage类正好有一个compressToJPEG(Rect rect, int i, OutputStream)方法,可以直接将数据保存在JPG文件的输出流中。

  2、PNG转Bitmap
 

byte[] data = null;
 File pngImage = null;
 BufferedOutputStream stream = null;
 try {
   pngImage = new File(outputFile); //outputFile为png图像名称
   FileOutputStream fstream = new FileOutputStream(pngImage);
   stream = new BufferedOutputStream(fstream);
   stream.write(data);
 } catch (Exception e) {
   e.printStackTrace();
 } finally {
   if (stream != null) {
     try {
     stream.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }
 Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);

  如果通过资源(drawable)的形式,那就方便地多,只需要一句话。

代码如下:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

  虽然没有华丽的算法,但效果不错哦,就是想改变图像属性时得另外实现。

  3、ARGB转Bitmap

 Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length); 
 Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); 
 if(bitmapNew == null) 
   return;
 for(int i = 0;i>16; 
     int green = (col&0x0000FF00)>>8; 
     int blue = (col&0x000000FF); 
     int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11); 
     int newColor = alpha|(gray<<16)|(gray<<8)|gray; 
   } 
 } 
 sendMsg(bitmapNew); 
 File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg"); 
 OutputStream out; 
 try { 
   out = new FileOutputStream(file); 
   if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out)) 
   out.close(); 
 } catch (FileNotFoundException e) { 
   e.printStackTrace(); 
 } catch (IOException e) { 
   e.printStackTrace(); 
 } 

      以上全部内容就是在Android程序开发过程中处理图像格式类及图像转换的方法,需要注意的是,在代码中做了灰度处理,若想得到彩色图,分别对Bitmap图像R、G、B三通道赋值。希望大家能够喜欢。


推荐阅读
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文介绍了编程语言的基本分类,包括机器语言、汇编语言和高级语言的特点及其优缺点。随后详细讲解了Python解释器的安装与配置方法,并探讨了Python变量的定义、使用及内存管理机制。 ... [详细]
  • 在 Mac 上配置 NDK
    本文详细介绍了如何在 Mac 上配置 Android NDK,包括设置环境变量和解决常见问题的方法。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • Python环境下OpenCV的安装与验证方法
    本文介绍了如何在Python环境中安装OpenCV库及其额外模块,并提供了验证安装是否成功的具体步骤和代码示例。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • Java中提取字符串的最后一部分
    本文介绍了如何使用Java中的substring()和split()方法来提取字符串的最后一部分,特别是在处理包含特殊字符的路径时的方法与技巧。 ... [详细]
  • 新型量子内核助力机器学习分类
    国际科研团队开发出一种创新的量子机器学习分类方法,利用非线性量子内核显著提升了分类精度,为未来量子计算技术的发展开辟了新路径。 ... [详细]
author-avatar
细妹很快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有