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

来源:互联网 发布:手机数据网络自动打开 编辑:程序博客网 时间:2024/06/08 14:19

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);//将字节数字解析为BitmapdecodeFIle(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 放到某个流中去 一般是FileOutputStreamBoolean b =  newBitmap.compress(format,quality,stream);//进行压缩处理 判断是否成功 return newBitmap;

其他类

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

也可以是ImageView的getDrawable()方法获取到这个资源。是Bitmap与Drawable转换的一个桥梁。







0 0
原创粉丝点击