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内存
//如果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转换的一个桥梁。