在深入探討用來更改圖像的具體機(jī)制之前,讓我們看看如何創(chuàng)建一個(gè)新的空位圖對(duì)象,并在其上繪制已有的位圖。這是將用來創(chuàng)建圖像的更改版本的過程。
上述示例獲得了一個(gè)位圖對(duì)象,使用用戶選擇的一幅圖像對(duì)其進(jìn)行實(shí)例化。正如在第1章中所介紹的那樣,通過調(diào)用BitmapFactory的decodeStream方法對(duì)它進(jìn)行實(shí)例化。
Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().
openInputStream(imageFileUri), null, bmpFactoryOptions);
為了使用該位圖對(duì)象作為圖像編輯實(shí)驗(yàn)的數(shù)據(jù)源,需要能夠以所應(yīng)用的效果在屏幕上繪制該位圖。此外,最好能夠?qū)⑺L制到可以用來保存結(jié)果圖像的對(duì)象中。因此,需要?jiǎng)?chuàng)建一個(gè)空的位圖對(duì)象,其尺寸與現(xiàn)有位圖對(duì)象的尺寸相同,并且將它作為更改位圖對(duì)象的目標(biāo)。
Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(),
bmp.getHeight(),bmp.getConfig());
當(dāng)創(chuàng)建這個(gè)更改位圖對(duì)象alteredBitmap時(shí),其寬度、高度和顏色深度均與源位圖對(duì)象(bmp)相同。由于使用Bitmap類的createBitmap方法,并且以寬度、高度和Bitmap.Config對(duì)象作為參數(shù),因此將獲得一個(gè)可變的位圖對(duì)象作為返回值??勺円馕吨梢愿脑撐粓D表示的像素值。如果有一個(gè)不可變的位圖對(duì)象,那么不能對(duì)其進(jìn)行繪制。此方法調(diào)用是唯一可用于實(shí)例化一個(gè)可變位圖對(duì)象的方式之一。
下面需要的是一個(gè)Canvas(畫布)對(duì)象。正如您所期望的那樣,在Android中畫布是可用于在其上進(jìn)行繪制的對(duì)象。可以通過在其構(gòu)造函數(shù)中傳入一個(gè)位圖對(duì)象來創(chuàng)建Canvas對(duì)象,隨后就可以將其用于繪制。
Canvas canvas = new Canvas(alteredBitmap);
最后,將需要一個(gè)Paint(畫刷)對(duì)象。當(dāng)進(jìn)行實(shí)際的繪制時(shí),Paint對(duì)象將發(fā)揮作用。具體而言,它使得我們能夠改變諸如顏色和對(duì)比度之類的參數(shù),后面章節(jié)將對(duì)其進(jìn)行詳細(xì)的介紹。目前使用默認(rèn)的Paint對(duì)象。
Paint paint = new Paint();
現(xiàn)在,為了在一個(gè)空的可變位圖對(duì)象上繪制源位圖對(duì)象,我們已經(jīng)具備了所有必需的組件。下面將剛才描述的所有代碼匯總在一起。
Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().
openInputStream(imageFileUri), null, bmpFactoryOptions);
Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(),bmp.getHeight(),
bmp.getConfig());
Canvas canvas = new Canvas(alteredBitmap);
Paint paint = new Paint();