android 圖像縮放

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設置縮放比例,來直接控制縮放。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章