android 图像缩放

本文介绍了Android中ImageView的ScaleType属性,详细解析了8种不同的缩放模式,并探讨了如何利用Matrix进行图像的平移、缩放和旋转。同时,讲解了Canvas、Bitmap和Drawable在图像处理中的作用,特别是如何通过它们实现图像的缩放效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ImageView的ScaleType

ImageView是Android中的基础图片显示控件,该控件有个重要的属性ScaleType,这个属性在一定程度上可以控制图片显示的缩放。Launcher中AppWidget的preview显示是通过ImageView显示,而且每个AppWidget的preview大小可能不一样,而给定的显示区域大小是一样的,故通过ScaleType属性来控制preview的显示。Imageview的ScaleType共有8种取值:

(1)  ScaleType.CENTER:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片的中间部分,若小于,则直接将图片居中显示。

(2)  ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长相同,即不能留有空白,缩放后截取中间部分进行显示。

(3)  ScaleType.CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小雨ImageView的图片不变,直接居中显示。

(4)  ScaleType.FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。

(5)  ScaleType.FIT_END:缩放方式同FIT_CENTER,只是将图片显示在右方或下方,而不是居中。

(6)  ScaleType.FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。

(7)  ScaleType.FIT_XY:将图片非等比例缩放到大小与ImageView相同。

(8)  ScaleType.MATRIX:是根据一个3x3的矩阵对其中图片进行缩放。

Launcher中ImageView的默认ScaleType值为ScaleType.MATRIX,当图片的尺寸过大时就将ScaleType的值设为ScaleType.FIT_START。

2.Matrix

线性代数中有关矩阵的乘法运算运用到Android中,来实现图像的平移,缩放,旋转等操纵,其相关类为android.graphics.Matrix。

(1)首先,举个简单的例子:设点p0(x0,y0)进行平移后,移到p(x,y),其中x方向的平移量为△x,y方向的平移量为△y,那么,点p(x,y)的坐标为:

x=x0+△x

y=y0+△y

采用矩阵表达上述关系如下:


上述也类似于图像的平移,通过上述矩阵发现,只需要改变矩阵右上角的两个元素就可以实现平移了。

代码实现为:

float a=10f;

float b=10f;

Matrix matrix=new Matrix();

matrix.setTranslate(a, b);

亦可以通过设置矩阵的值来实现平移:

float f[]={1f,0f,10.0f,0f,1f,10.0f,0f,0f,1f};

Matrix matrix=new Matrix();

Matrix.setValues(f);

(2)举个具体的例子,来实现缩放功能:设点p0(x0,y0),放大后变为p(x,y)其中x放大a倍,y方法b倍

x=a*x0;

y=b*y0;

采用矩阵的表达上述结果为:


float a=10f;

float b=10f;

Matrix matrix=new Matrix();

matrix.setScale(a, b);

亦可以通过设置矩阵的值来实现平移:

float f[]={10.0f,0f,0.0f ,0f, 10.0f,0.0f,0f,0f,1f};

Matrix matrix=new Matrix();

Matrix.setValues(f);

(3)实现旋转的功能:设点为p(x0,y0)旋转θ角后的对应点为p(x,y)。通过使用向量,得到如下:

x0=r*cosα

y0=r*sinα

x=r*cos(α+θ)= x0cosθ - y0 sinθ

y=r sin(α+θ)= x0 sinθ + y0 cosθ

得到矩阵如下:


代码设置为:

float a=30.0f;

Matrix matrix=new Matrix();

matrix.setRotate(a);

其中这是按照原点旋转的。如果按照某一个点旋转如下:

matrix.setRotate(a,x,y);

在实现图像的上述功能中,Matrix与Bitmap结合使用,如下

floatf[]={1f,0f,10.0f,0f,1f,10.0f,0f,0f,1f};

Matrix matrix=new Matrix();

Matrix.setValues(f);

Bitmap bm2=Bitmap.createBitmap(bm1,0,0,width,height,matrix,true);

 

3.Canvas、Bitmap、Drawable

首先,先介绍Canvas,Bitmap,Drawable:

Canvas:名为画布,可以看做是一种处理过程,使用各种方法来管理Bitmap、GL或者path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时canvas类还提供了裁剪、选取等操作。

Bitmap:称为位图,一般位图的文件格式后缀为bmp,是android系统中和的图像处理的最重要的类之一。用它可以火族图像文件的信息,进行图像的裁剪、选装错放等操作,并可以指定格式保存图像文件。

Drawable:它是一个通用的抽象类,它的目标是告诉你什么东西可以画的。基于Drawable类扩展出各种绘图类,也可以继承它来创建自己的绘图类,Launcher中FastBitmapDrawable就是这样的。介绍两种方式创建Drawable:从资源图像文件中创建,从XML文件中创建。

Canvas,Bitmap和Drawable在Launcher中结合使用,来实现图像的缩放如下:

Canvas canvas=new Canvas();

Bitmap orig=……;//目标bitmap

int w=orig,getWidth();

int h=orig.getHeight();

Bitmapb=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);

Canvas.setBitmap(b);

Rect src=new Rect(0,0,w,h);//源矩形

float scale=0.5f;

Rect dst=new Rect(0,0,(int)(w*scale),(int)(h*scale));//目标矩形

Canvas.drawBitmap(orig,src.dst,null);

显示的图像经过变换后,经过源矩形与目标矩形的设置来控制缩放。

Drawable d=……;

Canvas c=new Canvas(bitmap);

c.scale(scale,scasle);//设置缩放比例

Rect oldBounds=d.copyBounds();

d.setBounds(x.y,x+w,y+h);

d.draw(c);

d.setBounds(oldBounds);

经过Canvas设置缩放比例,来直接控制缩放。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值