您的位置:首页 > 移动开发 > Android开发

Android 位图加载 采样 缓存设计 Bitmap

2015-01-20 13:15 495 查看
Bitmap一般可以成文一个图片工具类 ,进行制定大小的压缩。进行固定大小的压缩

Bitmap 可以通过BitmapDrawable来创建,也可以通过creatBitmap来创建,有好多钟方式

createBitmap(Bitmap source,int x,int y,int width,int height);//源位图钟挖取
createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter);//源位图进行缩放到这个大小
createBitmap(Bitmap source,int x,int y,int width,int height,Matrix m ,boolean filter);//创建新位图
decodeByteArray(byte[] data,int offset,int lenght);//将字节数字解析为Bitmap
decodeFIle(String pathName);//从文件名种获得
decodeResource(Resource res,int id);//从资源钟获得
decodeStream(InputStream is);//从InputStream中获得
//我们需要注意一点,我们事情做完的bitmap记得要回收内存
boolean isRecycled() and void recycle()最好是不在UI中显示的图就把他recycle掉
BitmapDrawable bitmapDrawable = (BitmapDrawable )iv.getDrawable();
if(bitmapDrawable.getBitmap().isRecycle()){
bitmapDrawable.getBitmap().recycle();
}

高效加载大位图,压缩

这是一套图片处理的机制,因为图片占用内存太大了 。 

Bitmap的知识点 ,最典型的就是ImageView,这个会一直保存在UI。

因为图片是字节的形式存在的 可以从资源,文件,uri和字节流中取出文件。

<pre name="code" class="java">//BitmapFactory设置参数
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; //如果设置为true,并不会把图像的数据完全解码,只有图片的基本信息,不会将图片数据读入内存
opt.inPreferredConfig=Bitmap.Config.RGB_565;//表示16位位图 565代表对应三原色占的位数
options.inSampleSize = 8; //设置decode时的缩放比例。
opt.inPurgeable=true;//设置图片可以被回收  当下载图片需要控制内存的时候用

opt.inInputShareable=true;//当下载图片需要控制内存的时候用 我也不知道干嘛用
options.outHeight;//图片的高度
options.outWidth;//图片的宽度
options.outMimeType;//图片的类型


ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存
(默认)
RGB_565:每个像素占用2byte内存

获取到Bitmap

//如果options.inJustBounds为true,则获取到的bitmap只有基本信息,为false才会有图片,才能导出
Bitmap bitmap = BitmapFactory.decodeFile(pathName:String,opts:Options); 	//获取文件中的图片
Bitmap bitmap = BitmapFactory.decodeResource(res:Rescources,id:int,opts:Options);//一般的Rescources 直接getRescources()就好了 ,获取资源中的图片
Bitmap bitmap = BitmapFactory.decodeStream(in:InputStream); //从输入流转bitmap
<pre name="code" class="java">Bitmap bitmap = BitmapFactory.decodeStream(in:InputStream,outPadding:Rect,opts:Options); //从输入流转bitmap,中间一个参数为形状
iv.setImageBitmap(bitmap);


config是枚举类型 分为  ALPHA_8,ARGB_8888   一般就用ARGB_8888

 加水印(涉及画布画笔知识点)
需要在原来的基础上先拷贝一份新的位图

Bitmap newBitmap =  bitmap.copy(Bitmap.Config:config,isMutable:boolean);//true 位图是可以变化的
Canvas canvas = new Canvas(newBitmap);//一块画布以newBitmap为背景
Paint paint = new paint();//一支画笔
canvas.drawXXX();
//format 格式 鼓励用png 不鼓励用gif 可以用jpeg 			Bitmap.CompressFormat.PNG
//quality 照片质量 0到100 压缩的大小
//stream 放到某个流中去 一般是FileOutputStream
Boolean b =  newBitmap.compress(format,quality,stream);//进行压缩处理 判断是否成功
return newBitmap;

其他类

BitmapDrawable 这是一个封装类,封装了一个Bitmap。通过getBitmap()可以重新得到Bitmap。但实际情况中都是直接当做Drawable去使用了。

也可以是ImageView的getDrawable()方法获取到这个资源。是Bitmap与Drawable转换的一个桥梁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: