Android ApiDemos示例解析(54):Graphics->BitmapDecode

BitmapDecode 例子主要介紹瞭Android 平臺對圖像的解碼功能,Android平臺支持PNG, JPEG圖像格式,並可以支持 gif動畫。

Android API中用來解碼圖像的類主要有BitmapFactory (靜態圖像PNG或是JPEG)和Movie 解碼動畫(gif動畫等)。

對圖像或動畫解碼,數據源可以說byte 數組,InputStream ,資源ID,或者指定文件名。對於BitmapFactory來說,還可以通過BitmapFactory.Options 指定解碼時的一些設置。

下面代碼指定opts.inJustDecodeBounds = true,表示解碼時隻想獲取被解碼圖像的長度和寬度,此時bm返回值為null, 而opts.outWidth, opts.outHeight中返回瞭圖像的寬度和長度。這種用法解碼器無需為被解碼的圖像分配內存而值是通過BitmapFactory.Options 的輸出參數返回有關圖像的一些信息。

[java] 
BitmapFactory.Options opts = new BitmapFactory.Options(); 
Bitmap bm; 
  
opts.inJustDecodeBounds = true; 
bm = BitmapFactory.decodeStream(is, null, opts); 
  
// now opts.outWidth and opts.outHeight are the dimension of the  
// bitmap, even though bm is null 
BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bm;
 
opts.inJustDecodeBounds = true;
bm = BitmapFactory.decodeStream(is, null, opts);
 
// now opts.outWidth and opts.outHeight are the dimension of the
// bitmap, even though bm is null
下面代碼將采樣大小設為4,相當於每隔4個像素采樣一次,結果是解碼後的圖像為原圖的四分之一(具體的采用算法由平臺決定,並非簡單的隔4個像素取其中一個像素值)。

[java] 
opts.inJustDecodeBounds = false;    // this will request the bm  
opts.inSampleSize = 4;             // scaled down by 4  
bm = BitmapFactory.decodeStream(is, null, opts); 
  
mBitmap = bm; 
opts.inJustDecodeBounds = false;    // this will request the bm
opts.inSampleSize = 4;             // scaled down by 4
bm = BitmapFactory.decodeStream(is, null, opts);
 
mBitmap = bm;
下面代碼從資源文件通過InputStream解碼圖像:

[java] 
// decode an image with transparency  
is = context.getResources().openRawResource(R.drawable.frog); 
mBitmap2 = BitmapFactory.decodeStream(is); 
// decode an image with transparency
is = context.getResources().openRawResource(R.drawable.frog);
mBitmap2 = BitmapFactory.decodeStream(is);
對應解碼後的圖像Bitmap對象,可以通過getPixels取的圖像對應的像素值數組,有瞭這個像素值數組,Bitmap可以創建不同配置的圖像,下面代碼創建兩種配置的圖像:ARGB_8888,ARGB_4444,新圖像每個像素占用的字節大小不一。

[java] 
int w = mBitmap2.getWidth(); 
int h = mBitmap2.getHeight(); 
int[] pixels = new int[w*h]; 
mBitmap2.getPixels(pixels, 0, w, 0, 0, w, h); 
mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h, 
 Bitmap.Config.ARGB_8888); 
mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h, 
 Bitmap.Config.ARGB_4444); 
int w = mBitmap2.getWidth();
int h = mBitmap2.getHeight();
int[] pixels = new int[w*h];
mBitmap2.getPixels(pixels, 0, w, 0, 0, w, h);
mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,
 Bitmap.Config.ARGB_8888);
mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,
 Bitmap.Config.ARGB_4444);
對應Drawable資源來說,更一般的做法是直接使用Resources對象來取得相應的Drawable資源:

[java] 
mDrawable = context.getResources().getDrawable 
 (R.drawable.button); 
mDrawable.setBounds(150, 20, 300, 100); 
mDrawable = context.getResources().getDrawable
 (R.drawable.button);
mDrawable.setBounds(150, 20, 300, 100);
android.graphics.Movie對應可以用來解碼.gif動畫資源,從數組或是直接從InputStream中解碼:R.drawable.animated_gif 為一飄動的旗幟動畫。

[java] 
is = context.getResources() 
 .openRawResource(R.drawable.animated_gif); 
if (true) { 
 mMovie = Movie.decodeStream(is); 
 } else { 
 byte[] array = streamToBytes(is); 
 mMovie = Movie.decodeByteArray(array, 
 0, array.length);  www.aiwalls.com
 }
 
作者:mapdigit
 

發佈留言