Android——动态缩放图片

来源:互联网 发布:mac安装win10启动黑屏 编辑:程序博客网 时间:2024/06/05 08:48

最近学习自定义view控件的过程碰到需要根据控件本身的大小动态绘制图片,主要用到了以下三种方法进行图像缩放

首先,先从文件资源里加载bitmap

Bitmap bitmpSrc=BitmapFactory.decodeResource(getResources(),R.drawable.img1);//取得图片本身宽和高int srcW=bitmapSrc.getWidth();int srcH=bitmapSrc.getHeight();//还要在onMeasure中获得当前的view的宽和高width=MeasureSpec.getSize(widthMeasureSpec);height=MeasureSpec.getHeight(heightMeasureSpec);//计算缩放比例scaleW=width*1.0f/srcW;scaleH=height*1.0f/srcH;

下面介绍三种bitmap的缩放操作(Bitmap图片本身不能改变的,要通过新建一张Bitmap,在上面绘制图像)

1.利用canvas本身的scale

//创建一个View大小的Bitmap;Bitmap bm=Bitmap.create(width,height,Bitmap.Config.ARGB_8888);Canvas canvas=new Canvas(bm);//在新建的bm上绘制canvas.scale(scaleW,scaleH);//将画布结构先进行缩放canvas.drawBitmap(bitmap,0,0,null);//在画布上绘制bitmap(这张画布是在bm上的,所以实际是在bm上绘制bitmap)/** canvas.drawBitmap(Bitmap source,float left,float top,Paint paint)*@param Bitmap source ,源文件*@param float left,从距离左边left开始绘制*@param float top,从距离上面top绘制*@param Paint paint,使用的画笔*@return**/

2.使用Matrix 来配合canvas完成缩放

//同样根据view大小创建bitmapBitmap bm=Bitmap.create(width,height,Bitmap.Config.ARGB_8888);Canvas canvas= new Canvas(bm);Matrix matrix=new Matrix();matrix.setScale(scaleW,scaleH);canvas.drawBitmap(bitmap,matrix,null);//使用matrix完成了缩放/** canvas.drawBitmap(Bitmap source,Matrix matrix,Paint paint)*@param Bitmap source ,源文件*@param Matrix matrix,变换矩阵3*3,可以完成一系列变换,不只是缩放*@param Paint paint,使用的画笔*@return**/

3.不使用Canvas,直接通过Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

Matrix matrix=new Matrix();matrix.setScale(scaleW,scaleH);Bitmap bm=Bitmap.createBitmap(bitmap, 0, 0, srcW,srcH, matrix, true );//这种方法好像是最简单的,不需要//Canvas的辅助,最终生成的bitmap大小也是动态的/** createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)*@param Bitmap source ,源文件*@param int x,从源图像水平方向x选取图像开始绘制到目标图像*@param int  y,从源图像竖直方向y选取图像开始绘制到目标图像*@param int  width,注意,要画源图像从x开始多宽的图像*@param int height ,注意,要画源图像从y开始多高的图像*@param Matrix matrix,变换的矩阵*@param bolean filter,当进行的不只是平移变换时,filter参数为true可以进行滤波处理,有助于改善新图像质量;flase时,计算机不做过滤处理*@return**/
0 0