Bitmap解析

Bitmap(位图) 是android系统图像处理中很重要的类。它将图像描述为像素点矩阵,每个像素点占有一定内存。一个像素点可以有A(透明度)R(红色)G(绿)B(蓝)四个通道,由这几个通道的值来一起描述这个像素点的色值。

在绘制图像,操作图像,如放大,旋转等,都会用到Bitmap。

这里主要讲解Bitmap的一些重要属性和方法。

重要属性:

Width,Height

宽高。宽高有多少个像素。

Config

Bitmap在内存中存储的方式。

public final Config getConfig()

Bitmap.Config

这是Bitmap的一个内部enum。

public static finalBitmap.Config ALPHA_8

一个像素点1字节,只存储Alpha通道,即透明度。

public static finalBitmap.Config ARGB_4444

一个像素点2个字节。ARGB各占4位。

API13已被废弃。建议用ARGB_8888

public static finalBitmap.Config ARGB_8888

一个像素点4个字节。ARGB各占1字节。

public static finalBitmap.Config RGB_565

一个像素点2个字节。
R占5位,G占6位,B占5位。不透明,没有Alpha通道。

density

密度。默认是当前屏幕的密度。也可以设置。

public void setDensity(int density)
public int getDensity()

当Bitmap往Canvas上画时,会根据Canvas的density进行缩小,放大。

Bitmap中有一个方法:

static public int scaleFromDensity(int size, int sdensity, int tdensity) {
        if (sdensity == DENSITY_NONE ||tdensity == DENSITY_NONE || sdensity == tdensity) {
            return size;
        }

        // Scale by tdensity / sdensity,rounding up.
        return ((size * tdensity) + (sdensity>> 1)) / sdensity;
}

就是根据当前的密度,目标的密度,算出新的尺寸,(四舍五入)。

mutable

像素点是否可以修改。

public final boolean isMutable()

为true的话,可以通过下面的方法,

public void setPixel(int x, int y, int color)

将(x,y)坐标点颜色设为 color

创建Bitmap:

public static Bitmap createBitmap(…)

Bitmap中有一系列createBitmap的(重载)方法。

可以根据给定色值矩阵来创建一个bitmap。

可以根据一个Bitmap(源Bitmap),来创建一个Bitmap。这里有一个问题,返回的Bitmap有可能与源Bitmap是一个对象,而不是重新创建。这样的话,其中一个调用了recycle()释放的话,另一个当然也不能用了。

可以创建相对源Bitmap变化了的Bitmap,如位移,旋转,放大缩小等。利用
Matrix。

public Bitmap copy(Config config, boolean isMutable)

根据现有Bitmap,参数,复制一个新的Bitmap

一些参数:

DisplayMetrics display

     只是用了display中的density,设置为Bitmap的density

Bitmap.Config config

像素存储格式

Matrix m

这是一个矩阵。利用它可以创建放大缩小,旋转等的图片。

Bitmap的图像内容是一个矩阵,对矩阵进行放大缩小,位移,旋转等可以通过与另一个矩阵相乘来实现,这是线性代数的内容。

boolean filter

对图片缩小时没有影响。对图片放大时,true会得到平滑的图片。false得到的图片会一块块的像素点。

参考:http://stackoverflow.com/questions/2895065/what-does-the-filter-parameter-to-createscaledbitmap-do

BitmapFacotory中也有一系列创建Bitmap的静态方法:

BitmapFactory.decode...(...)

可以:

从文件decode出Bitmap

从Inputstream中decode出Bitmap

持久化

Bitmap实现了Parcelable接口。可以通过Parcelable传输,持久化。

可以写入输出流中:

public boolean compress(CompressFormat format,int quality, OutputStream stream)

CompressFormat


图片格式 JPEG , PNG WEBP


quality


压缩率。0压缩最大,100不压缩。PNG会忽略此值

可以写入到Buffer 中:

 public void copyPixelsToBuffer(Buffer dst)
 publicvoid copyPixelsFromBuffer(Buffer src)

一些方法:

public int getGenerationId ()

当Bitmap被修改时,generationId会变,可以通过这个值来判断图片有没有被修改。

public final boolean  isPremultiplied()

Multipy是乘的意思,乘法的乘。字面上的意思是有没有被“预乘”过,这是什么意思呢?

看个例子:

如果一个颜色是(128,255, 0, 0)即50%透明度的红色,“预乘”后,就成了(128,
128, 0, 0)。

对了,就是把初始色值的RGB值与透明度相乘。

这有什么用呢?

一个有透明度的Bitmap要被系统画出来,就必须先被“预乘”,否则会抛出异常。所以有个“预”(pre)字。

对没有透明度的Bitmap来说,这个没有意义。

public void recycle ()

清除本地对象,清除只想像素数据(pixel data)的引用。

确定不用了才能掉。否则会出问题。

一般不需要调用。一般情况GC的回收机制能解决问题。

public final boolean isRecycled ()

有没有被回收。如果没回收了的话,就不能访问它的像素,不能被画出。

public void setConfig (Bitmap.Configconfig)

public void reconfigure (int width, int height,Bitmap.Configconfig)

修改Bitmap的宽,高,config,但是并没有修改Bitmap的像素数据。这样避免了重新分配像素点矩阵的内存,减少了内存分配开销,也有更好的性能。

只支持由大(占用内存)变小。由小变大会抛异常。

占用内存

Bitmap中,占用内存的主要是 像素点矩阵占用的内存,其他的基本可以忽略。

像素点矩阵占用的内存大小=像素点数 * 每个像素点占用内存 = 长*宽*每个像素点占用内存。

Bitmap格式是非常占用内存的,加载大图片时经常会出现oom(内存溢出)。

按照 长*宽*每个像素点占用内存 算下的可能比实际占用的要小。

使用 reconfigure() 将bitmap由大变小。之前说过,调用这个方法时,bitmap尺寸小了,但是像素点矩阵并没有变。

获取占用内存:

时间: 2024-10-01 02:25:59

Bitmap解析的相关文章

使用BitmapFactory不同方法解析Bitmap的简单分析

使用BitmapFactory不同方法解析Bitmap的简单分析 相信大家在平时进行Android的开发过程中,都有使用过Bitmap. 其实Google自己也有一个简单介绍Bitmap如何使用的文章,Manage Bitmap Memory.在这里对一些简单的Bitmap内存优化做了介绍. 其实我写这篇文章的初衷是由于最近在写一个涉及到很多张Bitmap显示的控件,但是由于图片过多,假如完全显示会导致OOM,因此需要建立了一个图片缓存, 现在我手上有800多张136px*128px大小的图片,

pull解析解析月考题

MainActivity.class: package com.example.map_new_two; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.

干货分享,图片模糊算法,解析xml绘制图片

        项目需求:有一个xml文件,记录了一张图片每个元素的位置,大小,样式信息. 通过XmlResourceParser解析xml文件,得到每个元素的属性. 然后使用Paint绘制元素到Canvas上,得到一张Bitmap位图 将位图模糊处理,处理算法的原理(取图片上每个像素点周围的8个点平均值) 模糊算法: package com.metek.blur; import android.content.Context; import android.graphics.Bitmap; p

RxHttp 让你眼前一亮的Http请求框架

1.前言 RxHttp在今年4月份一经推出,就受到了广大Android 开发者的喜爱,截止本文发表在github上已有1100+star,为此,我自己也建个RxHttp&RxLife 的群(群号:378530627)目前群里也有将近180号人,里面有不少小伙伴提了很多有价值的创意,才使得RxHttp一直坚持走到了现在,在此,感谢大家的喜爱. 这期间,一直有人问我,retrofit不香吗?之前不知道该如何回答这个问题,现在我想说,香!!retrofit无疑是目前综合得分最高的选手,但它也有它的不足

为何这篇RxHttp Http请求框架会如此销魂,全文干货建议收藏!

前言 RxHttp相较于retrofit,功能上,两者均能实现,并无多大差异,更多的差异体现功能的使用上,也就是易用性,如对文件上传/下载/进度监听的操作上,RxHttp用及简的API,可以说碾压retrofit:另外在baseUrl.公共参数/请求头.请求加解密等功能上的易用性都要优于retrofit:然而这些,个人觉得都不算什么,个人觉得RxHttp最大的优势在于它近乎为0的上手成本.极简的API以及高扩展性,看完这篇文章,相信你会有同感. 那RxHttp就没有缺点吗?有,那就是它的稳定性目

Android异步加载全解析之Bitmap

Android异步加载全解析之Bitmap 在这篇文章中,我们分析了Android在对大图处理时的一些策略--Android异步加载全解析之大图处理  戳我戳我 那么在这篇中,我们来对图像--Bitmap进行一个更加细致的分析,掌握Bitmap的点点滴滴. 引入 Bitmap这玩意儿号称Android App头号杀手,特别是3.0之前的版本,简直就是皇帝般的存在,碰不得.摔不得.虽然后面的版本Android对Bitmap的管理也进行了一系列的优化,但是它依然是非常难处理的一个东西.在Androi

Android Bitmap 全面解析(四)图片处理效果对比 ...

对比对象: UIL Volley 官方教程中的方法(此系列教程一里介绍的,ImageLoader的处理方法和官方的差不多) ------------------------------------------------------------------------ 首先单张图片的压缩处理,也是分析重点 专门撸了一个小demo(结尾会放出下载连接)将对应计算方法copy了出来,然后计算了几十组数据,进行了对比 原图宽高都是一个10000以内的随机整数,限定大小是400 200,然后进行压缩处理

Android Bitmap 全面解析(一)加载大尺寸图片

压缩原因:1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为;2.最重要的是图片过大时直接加载原图会造成OOM异常(out of memory内存溢出)所以一般对于大图我们需要进行下压缩处理权威处理方法参考 安卓开发者中心的大图片处理教程http://developer.android.com/training/displaying-bitmaps/load-bitmap.html看不懂英文的话木有关系,本篇会有介绍主要处理思路是:1.获

36、Android Bitmap 全面解析

Android Bitmap 全面解析(一)加载大尺寸图片 http://www.eoeandroid.com/thread-331669-1-1.html Android Bitmap 全面解析(二)加载多张图片的缓存处理http://www.eoeandroid.com/thread-332399-1-1.html Android Bitmap 全面解析(三)开源图片框架分析1-UIL(上)http://www.eoeandroid.com/thread-333220-1-1.html An