Android中的位图资源简介 创建 加载 保存

本文详细介绍了Android中位图资源的加载、创建与保存过程,包括使用BitmapDrawable、BitmapFactory加载资源,创建ARGB_8888、RGB_565类型位图,并展示如何在位图上进行绘图及最终将修改后的位图保存为PNG文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 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类提供的方法创建位图资源。  
  2.    
  3. 一、加载位图资源  
  4.           
  5.         在Android中图片资源通常会放置于res/drawable目录或者assets目录,下面分别对这两种不同的情况进行分析。  
  6. 使用BitmapDrawable加载res/drawable目录下的android.png资源文件,Java代码如下:   
  7. [代码]java代码:  
  8. view sourceprint?01 //获取res目录下的drawable资源    
  9.   
  10. 02 public Bitmap getDrawableBitmap() {    
  11.   
  12. 03  //获取应用资源集管理实例    
  13.   
  14. 04  Resources mResources = getResources();    
  15.   
  16. 05  //获取drawable资源frame,转换为 BitmapDrawable类型    
  17.   
  18. 06  BitmapDrawable mBitmapDrawable = (BitmapDrawable) mResources.getDrawable(R.drawable.android);    
  19.   
  20. 07  //获取bitmap    
  21.   
  22. 08  Bitmap mBitmap = mBitmapDrawable.getBitmap();    
  23.   
  24. 09       
  25.   
  26. 10  return mBitmap;    
  27.   
  28. 11 }   
  29.   
  30.         使用上面的方法获取bitmap时需要注意,这种方法只能对于普通的图片资源,对于点九图片或者其他的drawable类型不能直接获取,可以通过BitmapFactory类进行加载。BitmapFactory类提供了很多decode开头的方法,通过这些方法可以加载所有类型的图片资源。  
  31.    
  32.         使用BitmapFactory类的decodeResource加载res/drawable目录下的android.png资源文件,Java代码如下:   
  33. [代码]java代码:  
  34. view sourceprint?1 //获取res目录下的drawable资源    
  35.   
  36. 2 public Bitmap getResourceBitmap() {    
  37.   
  38. 3  Resources mResources = getResources();    
  39.   
  40. 4  Bitmap mBitmap = BitmapFactory.decodeResource(mResources, R.drawable.android);    
  41.   
  42. 5       
  43.   
  44. 6  return mBitmap;    
  45.   
  46. 7 }   
  47.   
  48.         也可以使用BitmapFactory类的decodeStream加载assets文件夹下的图片资源,Java代码如下:   
  49. [代码]java代码:  
  50. view sourceprint?01   //获取assets目录下的图片资源    
  51.   
  52. 02   public Bitmap getAssetsBitmap() {    
  53.   
  54. 03    //定义Bitmap    
  55.   
  56. 04    Bitmap mBitmap = null;    
  57.   
  58. 05         
  59.   
  60. 06    //获取assets资源管理实例    
  61.   
  62. 07    AssetManager mAssetManager = getAssets();    
  63.   
  64. 08         
  65.   
  66. 09    try {    
  67.   
  68. 10     //打开frame.png文件流    
  69.   
  70. 11  InputStream mInputStream = mAssetManager.open("android.png");    
  71.   
  72. 12  //通过decodeStream方法解析文件流    
  73.   
  74. 13  mBitmap = BitmapFactory.decodeStream(mInputStream);    
  75.   
  76. 14 } catch (IOException e) {    
  77.   
  78. 15  // TODO Auto-generated catch block    
  79.   
  80. 16  e.printStackTrace();    
  81.   
  82. 17 }    
  83.   
  84. 18         
  85.   
  86. 19    return mBitmap;    
  87.   
  88. 20   }   
  89.   
  90.    
  91. 二、创建位图资源  
  92.    
  93.         在应用中既可以加载已经存在的图片资源,也可以通过Bitmap类提供的方法创建新的位图资源,还可以在新建的位图资源上绘制几何图形、其他的位图资源或者drawable资源。通常在进行图像变换时,为了不改变原来的位图资源,在图像变换之前会建立一个新的位图,然后在新建立的位图上进行操作。如果需要在位图上进行绘图,就需要使用Canvas类和Paint类。Canvas类代表了一块画板,而Panit类代表了画笔,它们很形象地描述了绘画模型。如果要处理bitmap时,需要把bitmap与Canvas关联起来,这样就可以把Bitmap作为画板,使用Paint设置绘画的风格,然后使用Canvas的draw方法进行绘图。  
  94.    
  95.         下面的代码演示了如何创建一个Bitmap,然后在bitmap上进行绘图,Java代码如下:   
  96. [代码]java代码:  
  97. view sourceprint?01 //创建Bitmap资源    
  98.   
  99. 02 public Bitmap drawGraphics() {    
  100.   
  101. 03  //创建大小为320 x 480的ARGB_8888类型位图    
  102.   
  103. 04  Bitmap mBitmap = Bitmap.createBitmap(320480, Config.ARGB_8888);    
  104.   
  105. 05  //把新建的位图作为画板    
  106.   
  107. 06  Canvas mCanvas = new Canvas(mBitmap);    
  108.   
  109. 07       
  110.   
  111. 08  //先画一个黑屏    
  112.   
  113. 09  mCanvas.drawColor(Color.BLACK);    
  114.   
  115. 10  //创建画笔,并进行设置    
  116.   
  117. 11  Paint mPaint = new Paint();    
  118.   
  119. 12  mPaint.setColor(Color.BLUE);    
  120.   
  121. 13  mPaint.setStyle(Style.FILL);    
  122.   
  123. 14       
  124.   
  125. 15  Rect mRect = new Rect(101030080);    
  126.   
  127. 16  RectF mRectF = new RectF(mRect);    
  128.   
  129. 17  //设置圆角半径    
  130.   
  131. 18  float roundPx = 15;    
  132.   
  133. 19       
  134.   
  135. 20  mPaint.setAntiAlias(true);    
  136.   
  137. 21  mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);    
  138.   
  139. 22  mPaint.setColor(Color.GREEN);    
  140.   
  141. 23  mCanvas.drawCircle(8018080, mPaint);    
  142.   
  143. 24       
  144.   
  145. 25  DashPathEffect mDashPathEffect = new DashPathEffect(new float[] {2020101055,}, 0);    
  146.   
  147. 26  mPaint.setPathEffect(mDashPathEffect);    
  148.   
  149. 27  Path mPath = new Path();    
  150.   
  151. 28  mRectF.offsetTo(10300);    
  152.   
  153. 29  mPath.addRect(mRectF, Direction.CW);    
  154.   
  155. 30       
  156.   
  157. 31  mPaint.setColor(Color.RED);    
  158.   
  159. 32  mPaint.setStrokeWidth(5);    
  160.   
  161. 33  mPaint.setStrokeJoin(Join.ROUND);    
  162.   
  163. 34  mPaint.setStyle(Style.STROKE);    
  164.   
  165. 35  mCanvas.drawPath(mPath, mPaint);    
  166.   
  167. 36       
  168.   
  169. 37  mCanvas.drawBitmap(getDrawableBitmap(), 16090, mPaint);    
  170.   
  171. 38       
  172.   
  173. 39  return mBitmap;        
  174.   
  175. 40 }   
  176.   
  177.         上面的代码表示在位图上分别绘制了圆角矩形区域、圆形区域、虚线矩形框和图片资源,运行效果如下:  
  178.    
  179.     
  180.   
  181.   
  182.   
  183. 7-1  创建位图资源  
  184.    
  185. 三、保存位图资源  
  186.    
  187.         当绘制了新的bitmap,或者修改了原始的bitmap之后,可以把修改的结果保存成图片文件,这样就可以在其他的地方使用了。Bitmap类提供了compress方法,可以很方便地把bitmap压缩并保存到图片文件中,在android中可以把bitmap保存成png和jpg两种格式的文件,对于png格式的图片来说它是属于无损压缩,而对于jpg格式的图片来说可以设置图片压缩的质量。  
  188.    
  189.         通过下面的代码可以把上一部分中创建的图片压缩并保存为png图片:   
  190. [代码]java代码:  
  191. view sourceprint?01   //保存位图资源    
  192.   
  193. 02   public static void saveBitmap(Bitmap bitmap, String path) {    
  194.   
  195. 03    FileOutputStream mFileOutputStream = null;    
  196.   
  197. 04         
  198.   
  199. 05    try {    
  200.   
  201. 06     File mFile = new File(path);    
  202.   
  203. 07     //创建文件    
  204.   
  205. 08  mFile.createNewFile();    
  206.   
  207. 09  //创建文件输出流    
  208.   
  209. 10  mFileOutputStream = new FileOutputStream(mFile);    
  210.   
  211. 11  //保存Bitmap到PNG文件    
  212.   
  213. 12  //图片压缩质量为75,对于PNG来说这个参数会被忽略    
  214.   
  215. 13  bitmap.compress(CompressFormat.PNG, 75, mFileOutputStream);    
  216.   
  217. 14  //Flushes this stream.     
  218.   
  219. 15  //Implementations of this method should ensure that any buffered data is written out.     
  220.   
  221. 16  //This implementation does nothing.    
  222.   
  223. 17  mFileOutputStream.flush();    
  224.   
  225. 18 } catch (IOException e) {    
  226.   
  227. 19  // TODO Auto-generated catch block    
  228.   
  229. 20  e.printStackTrace();    
  230.   
  231. 21 } finally {    
  232.   
  233. 22  try {    
  234.   
  235. 23   mFileOutputStream.close();    
  236.   
  237. 24  } catch (IOException e) {    
  238.   
  239. 25   // TODO: handle exception    
  240.   
  241. 26   e.printStackTrace();    
  242.   
  243. 27  }    
  244.   
  245. 28 }   
  246.   
  247.         保存之后的图片为:  
  248.    
  249.     
  250.   
  251.   
  252.   
  253. 7-2  保存位图资源  
  254.    
  255. Demo源代码下载:Bitmap_test.rar 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值