(Bitmap)ARGB_8888/RGB_565/ALPHA_8/ARGB_4444详解

有时会看到别人使用bitmap是用到ARGB_8888/RGB_565这类参数,那么这些参数是什么?对bitmap有什么影响?

他们是Bitmap.Config的四种枚举类型。

(ARGB分别是alpha透明度和red、green、blue三色)

ARGB_8888:分别用8位来记录4个值,所以每个像素会占用32位。

ARGB_4444:分别用4位来记录4个值,所以每个像素会占用16位。

RGB_565:分别用5位、6位和5位来记录RGB三色值,所以每个像素会占用16位。

ALPHA_8:根据注释应该是不保存颜色值,只保存透明度(8位),每个像素会占用8位。

那么对bitmap有何影响?

这里都以ARGB_8888为基准来进行对比。

ARGB_4444:内存占用减少一半,但是每个值图片失真度很严重,这个参数本身已经不推荐使用了。

RGB_565:内存占用减少一半,舍弃了透明度,同时三色值也有部分损失,但是图片失真度很小。

ALPHA_8:内存占用没有减少!按注释的解释个人理解应该是减少3/4的内存占用,而且图片与ARGB_8888下的没有区别。

(ALPHA_8查到的资料不多,希望有高手可以帮我解惑)

总结:

由于ARGB_4444不推荐使用和ALPHA_8效果不明。我们大多数是用的还是ARGB_8888和RGB_565。

RGB_565能够在保证图片质量的情况下大大减少内存的开销,是解决oom的一种方法。但是一定要注意RGB_565是没有透明度的,如果图片本身需要保留透明度,那么就不能使用RGB_565。

测试代码:
try {
URL url = new URL("http://h.hiphotos.baidu.com/image/pic/item/b21c8701a18b87d6b025e513040828381f30fd53.jpg");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
InputStream in = connection.getInputStream();
ByteArrayOutputStream content = new ByteArrayOutputStream();
byte[] buffer = new byte[10 * 1024];
int count;
while((count = in.read(buffer)) > 0){
content.write(buffer, 0, count);
}
byte[] data = content.toByteArray();

BitmapFactory.Options options1 = new BitmapFactory.Options();
options1.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap1 = BitmapFactory.decodeByteArray(data, 0 , data.length, options1);
//System.out.println("bitmap ARGB_8888 length " + bitmap1.getByteCount());
System.out.println("bitmap ARGB_8888 length " + bitmap1.getRowBytes() * bitmap1.getHeight());

BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap2 = BitmapFactory.decodeByteArray(data, 0 , data.length, options2);
//System.out.println("bitmap RGB_565 length " + bitmap2.getByteCount());
System.out.println("bitmap RGB_565 length " + bitmap2.getRowBytes() * bitmap2.getHeight());

BitmapFactory.Options options3 = new BitmapFactory.Options();
options3.inPreferredConfig = Bitmap.Config.ALPHA_8;
Bitmap bitmap3 = BitmapFactory.decodeByteArray(data, 0 , data.length, options3);
//System.out.println("bitmap ALPHA_8 length " + bitmap3.getByteCount());
System.out.println("bitmap ALPHA_8 length " + bitmap3.getRowBytes() * bitmap3.getHeight());

BitmapFactory.Options options4 = new BitmapFactory.Options();
options4.inPreferredConfig = Bitmap.Config.ARGB_4444;
Bitmap bitmap4 = BitmapFactory.decodeByteArray(data, 0 , data.length, options4);
//System.out.println("bitmap ARGB_4444 length " + bitmap4.getByteCount());
System.out.println("bitmap ARGB_4444 length " + bitmap4.getRowBytes() * bitmap4.getHeight());

} catch (Exception e) {
e.printStackTrace();
}

时间: 2024-10-17 07:56:32

(Bitmap)ARGB_8888/RGB_565/ALPHA_8/ARGB_4444详解的相关文章

Android开发之Bitmap.Config.RGB_565

在学习xutils框架的时候,看到sample代码中有一行这样的代码: 1 bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565); Bitmap.Config.RGB_565是什么意思呢? Bitmap.Config是Android.graphics.Bitmap类里的一个内部类,在Bitmap类里createBitmap(int width, int height, Bitmap.Config config)方法里会用到,打开

Bitmap详解与Bitmap的内存优化

感觉这里的排版看着更舒服些 Bitmap详解与Bitmap的内存优化 一.Bitmap: Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 常用方法: + public void recycle() // 回收位图占用的内存空间,把位图标记为Dead + public final boolean isRecycled() //判断位图内存是否已释放 + public final int getWid

APP性能优化系列:内存优化-bitmap详解

??在Android应用开发中,我们经常需要跟图片打交道,而图片一个很麻烦的问题是占用内存非常大,经常导致OOM,了解Bitmap相关信息,不同sdk版本中Android图片处理的变化,以及一些优化处理的方式对我们平时开发中对图片的会非常有帮助. ??在开始本节的内容之前我们.先来区分几个名词的概念: Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像, 也是前面学的那13种Drawable类型的可视化对象!我们可以理解成一个用来放画的--画框! Bitm

Android中Bitmap和Drawable详解

转自:http://dyh7077063.iteye.com/blog/970672 一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象 2.Canvas画布,绘图的目的区域,用于绘图 3.Bitmap位图,用于图的处理 4.Matrix矩阵 二.Bitmap 1.从资源中获取Bitmap Resources

Android开源框架Universal-Image-Loader详解

如果说评价一下哪个图片开源库最被广泛使用的话,我想应该可以说是Universal-Image-Loader,在主流的应用中如 果你随便去反编译几个,基本都能看到他的身影,它就像个图片加载守护者,默默的守护着图片加载.相信很多人对 这个异步加载图片框架还不是很熟,再加上最近它更改优化了好几个地方,而网上的大部分资料还是以前的,于是花 了几天时间专门的研究了下开源框架Universal-Image-Loader(实际上是近期项目刚好用到,且仔细的考虑过各种情 况),希望对新手能有所帮助,也希望大神能

Android开源框架Image-Loader详解

如果说评价一下哪个图片开源库最被广泛使用的话,我想应该可以说是Universal-Image-Loader,在主流的应用中如 果你随便去反编译几个,基本都能看到他的身影,它就像个图片加载守护者,默默的守护着图片加载.相信很多人对 这个异步加载图片框架还不是很熟,再加上最近它更改优化了好几个地方,而网上的大部分资料还是以前的,于是花 了几天时间专门的研究了下开源框架Universal-Image-Loader(实际上是近期项目刚好用到,且仔细的考虑过各种情 况),希望对新手能有所帮助,也希望大神能

android图片压缩质量参数Bitmap.Config RGB_565等的含义

android图片压缩质量参数 在实用ImageLoader中,在配置DisplayImageOptions时,需要设置.bitmapConfig(Bitmap.Config.RGB_565) 那么这个 Bitmap.Config.RGB_565 是什么意思呢 ? 在android中的大图片一般都要经过压缩才能显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节. 打开Android.graphics.Bitmap类里有一个

Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解

概述 类android.graphics.PorterDuffXfermode继承自android.graphics.Xfermode.在用Android中的Canvas进行绘图时,可以通过使用PorterDuffXfermode将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,这样会创建很多有趣的效果.当使用PorterDuffXfermode时,需要将将其作为参数传给Paint.setXfermode(Xfermo

Android基础入门教程——8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)

Android基础入门教程--8.3.7 Paint API之-- Xfermode与PorterDuff详解(四) 标签(空格分隔): Android基础入门教程 本节引言: 上节我们写了关于Xfermode与PorterDuff使用的第一个例子:圆角&圆形图片ImageView的实现, 我们体会到了PorterDuff.Mode.DST_IN给我们带来的好处,本节我们继续来写例子练练手, 还记得Android基础入门教程--8.3.2 绘图类实战示例给大家带来的拔掉美女衣服的实现吗? 当时我