Android中的位图资源简介

Android支持四种类型的位图(Bitmap)分别为ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,常用的类型是ARGB_8888和RGB_565。ARGB_8888类型的位图为32位的位图,它的每一个像素点有32位组成,每8位一组,每组代表的意思分别为Alpha(透明度)、Red(红)、Green(绿)、Blue(蓝);RGB_565类型的位图为16位位图,前7位表示Red(红),中间8位表示Green(绿),最后7位表示Blue(蓝)。在Android中图像使用Bitmap类表示,可以在需要处理图像的时候,使用BitmapFactory类提供的方法加载图片资源或者使用Bitmap类提供的方法创建位图资源。
 
一、加载位图资源
        
        在Android中图片资源通常会放置于res/drawable目录或者assets目录,下面分别对这两种不同的情况进行分析。
使用BitmapDrawable加载res/drawable目录下的android.png资源文件,Java代码如下: 
[代码]java代码:
view sourceprint?01 //获取res目录下的drawable资源  

02 public Bitmap getDrawableBitmap() {  

03  //获取应用资源集管理实例  

04  Resources mResources = getResources();  

05  //获取drawable资源frame,转换为 BitmapDrawable类型  

06  BitmapDrawable mBitmapDrawable = (BitmapDrawable) mResources.getDrawable(R.drawable.android);  

07  //获取bitmap  

08  Bitmap mBitmap = mBitmapDrawable.getBitmap();  

09     

10  return mBitmap;  

11 } 

        使用上面的方法获取bitmap时需要注意,这种方法只能对于普通的图片资源,对于点九图片或者其他的drawable类型不能直接获取,可以通过BitmapFactory类进行加载。BitmapFactory类提供了很多decode开头的方法,通过这些方法可以加载所有类型的图片资源。
 
        使用BitmapFactory类的decodeResource加载res/drawable目录下的android.png资源文件,Java代码如下: 
[代码]java代码:
view sourceprint?1 //获取res目录下的drawable资源  

2 public Bitmap getResourceBitmap() {  

3  Resources mResources = getResources();  

4  Bitmap mBitmap = BitmapFactory.decodeResource(mResources, R.drawable.android);  

5     

6  return mBitmap;  

7 } 

        也可以使用BitmapFactory类的decodeStream加载assets文件夹下的图片资源,Java代码如下: 
[代码]java代码:
view sourceprint?01   //获取assets目录下的图片资源  

02   public Bitmap getAssetsBitmap() {  

03    //定义Bitmap  

04    Bitmap mBitmap = null;  

05       

06    //获取assets资源管理实例  

07    AssetManager mAssetManager = getAssets();  

08       

09    try {  

10     //打开frame.png文件流  

11  InputStream mInputStream = mAssetManager.open("android.png");  

12  //通过decodeStream方法解析文件流  

13  mBitmap = BitmapFactory.decodeStream(mInputStream);  

14 } catch (IOException e) {  

15  // TODO Auto-generated catch block  

16  e.printStackTrace();  

17 }  

18       

19    return mBitmap;  

20   } 

 
二、创建位图资源
 
        在应用中既可以加载已经存在的图片资源,也可以通过Bitmap类提供的方法创建新的位图资源,还可以在新建的位图资源上绘制几何图形、其他的位图资源或者drawable资源。通常在进行图像变换时,为了不改变原来的位图资源,在图像变换之前会建立一个新的位图,然后在新建立的位图上进行操作。如果需要在位图上进行绘图,就需要使用Canvas类和Paint类。Canvas类代表了一块画板,而Panit类代表了画笔,它们很形象地描述了绘画模型。如果要处理bitmap时,需要把bitmap与Canvas关联起来,这样就可以把Bitmap作为画板,使用Paint设置绘画的风格,然后使用Canvas的draw方法进行绘图。
 
        下面的代码演示了如何创建一个Bitmap,然后在bitmap上进行绘图,Java代码如下: 
[代码]java代码:
view sourceprint?01 //创建Bitmap资源  

02 public Bitmap drawGraphics() {  

03  //创建大小为320 x 480的ARGB_8888类型位图  

04  Bitmap mBitmap = Bitmap.createBitmap(320, 480, Config.ARGB_8888);  

05  //把新建的位图作为画板  

06  Canvas mCanvas = new Canvas(mBitmap);  

07     

08  //先画一个黑屏  

09  mCanvas.drawColor(Color.BLACK);  

10  //创建画笔,并进行设置  

11  Paint mPaint = new Paint();  

12  mPaint.setColor(Color.BLUE);  

13  mPaint.setStyle(Style.FILL);  

14     

15  Rect mRect = new Rect(10, 10, 300, 80);  

16  RectF mRectF = new RectF(mRect);  

17  //设置圆角半径  

18  float roundPx = 15;  

19     

20  mPaint.setAntiAlias(true);  

21  mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);  

22  mPaint.setColor(Color.GREEN);  

23  mCanvas.drawCircle(80, 180, 80, mPaint);  

24     

25  DashPathEffect mDashPathEffect = new DashPathEffect(new float[] {20, 20, 10, 10, 5, 5,}, 0);  

26  mPaint.setPathEffect(mDashPathEffect);  

27  Path mPath = new Path();  

28  mRectF.offsetTo(10, 300);  

29  mPath.addRect(mRectF, Direction.CW);  

30     

31  mPaint.setColor(Color.RED);  

32  mPaint.setStrokeWidth(5);  

33  mPaint.setStrokeJoin(Join.ROUND);  

34  mPaint.setStyle(Style.STROKE);  

35  mCanvas.drawPath(mPath, mPaint);  

36     

37  mCanvas.drawBitmap(getDrawableBitmap(), 160, 90, mPaint);  

38     

39  return mBitmap;      

40 } 

        上面的代码表示在位图上分别绘制了圆角矩形区域、圆形区域、虚线矩形框和图片资源,运行效果如下:
 
  



图7-1  创建位图资源
 
三、保存位图资源
 
        当绘制了新的bitmap,或者修改了原始的bitmap之后,可以把修改的结果保存成图片文件,这样就可以在其他的地方使用了。Bitmap类提供了compress方法,可以很方便地把bitmap压缩并保存到图片文件中,在android中可以把bitmap保存成png和jpg两种格式的文件,对于png格式的图片来说它是属于无损压缩,而对于jpg格式的图片来说可以设置图片压缩的质量。
 
        通过下面的代码可以把上一部分中创建的图片压缩并保存为png图片: 
[代码]java代码:
view sourceprint?01   //保存位图资源  

02   public static void saveBitmap(Bitmap bitmap, String path) {  

03    FileOutputStream mFileOutputStream = null;  

04       

05    try {  

06     File mFile = new File(path);  

07     //创建文件  

08  mFile.createNewFile();  

09  //创建文件输出流  

10  mFileOutputStream = new FileOutputStream(mFile);  

11  //保存Bitmap到PNG文件  

12  //图片压缩质量为75,对于PNG来说这个参数会被忽略  

13  bitmap.compress(CompressFormat.PNG, 75, mFileOutputStream);  

14  //Flushes this stream.   

15  //Implementations of this method should ensure that any buffered data is written out.   

16  //This implementation does nothing.  

17  mFileOutputStream.flush();  

18 } catch (IOException e) {  

19  // TODO Auto-generated catch block  

20  e.printStackTrace();  

21 } finally {  

22  try {  

23   mFileOutputStream.close();  

24  } catch (IOException e) {  

25   // TODO: handle exception  

26   e.printStackTrace();  

27  }  

28 } 

        保存之后的图片为:
 
  



图7-2  保存位图资源
 
Demo源代码下载:Bitmap_test.rar

Demo源代码下载: Bitmap_test.rar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值