当前位置:操作系统 > 安卓/Android >>

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.zzzyk.com
 }
 \
作者:mapdigit
 


补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,