现在的位置: 首页 > 综合 > 正文

Android图形图画学习(5)——解码图片

2017年12月17日 ⁄ 综合 ⁄ 共 1542字 ⁄ 字号 评论关闭

Android API提供了两种解码图片的类:BitmapFactory解码jpg.png等静态图片,Movie类解码gif动态图片。

对图片解码,数据源可以是byte 数组,InputStream ,资源ID,或者指定文件名。对于BitmapFactory来说,还可以通过BitmapFactory.Options 指定解码时的一些设置。

下面代码指定opts.inJustDecodeBounds = true,表示解码时只想获取被解码图像的长度和宽度,此时bm返回值为null, 而opts.outWidth, opts.outHeight中返回了图像的宽度和长度。这种用法解码器无需为被解码的图像分配内存而值是通过BitmapFactory.Options 的输出参数返回有关图像的一些信息。

BitmapFactory.Options opts = new BitmapFactory.Options();    
Bitmap bm;    
           
opts.inJustDecodeBounds = true;    
bm = BitmapFactory.decodeStream(is, null, opts);

下面代码将采样大小设为4,相当于每隔4个像素采样一次,结果是解码后的图像为原图的四分之一(具体的采用算法由平台决定,并非简单的隔4个像素取其中一个像素值)。

opts.inJustDecodeBounds = false;       
opts.inSampleSize = 4;               
bm = BitmapFactory.decodeStream(is, null, opts);    
           
mBitmap = bm;

下面代码从资源文件通过InputStream解码图像:

is = context.getResources().openRawResource(R.drawable.frog);    
mBitmap2 = BitmapFactory.decodeStream(is);

对应解码后的图像Bitmap对象,可以通过getPixels取的图像对应的像素值数组,有了这个像素值数组,Bitmap可以创建不同配置的图像,下面代码创建两种配置的图像:ARGB_8888,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资源:

mDrawable = context.getResources().getDrawable    
 (R.drawable.button);    
mDrawable.setBounds(150, 20, 300, 100);



android.graphics.Movie对应可以用来解码.gif动画资源,从数组或是直接从InputStream中解码:R.drawable.animated_gif 为一飘动的旗帜动画。

if (DECODE_STREAM) {
     mMovie = Movie.decodeStream(is);
} else {
     byte[] array = streamToBytes(is);
     mMovie = Movie.decodeByteArray(array, 0, array.length);
  }

抱歉!评论已关闭.