安卓图片操作:drawable、bitmap、byte[]之间互转,以及drawable的操作

转载 2013年12月03日 14:17:43

一、相关概念

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象
2、Canvas画布,绘图的目的区域,用于绘图
3、Bitmap位图,用于图的处理
4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

1     Resources res = getResources();
2 Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);


2、Bitmap → byte[]

1     public byte[] Bitmap2Bytes(Bitmap bm) {
2 ByteArrayOutputStream baos = new ByteArrayOutputStream();
3 bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
4 return baos.toByteArray();
5 }


3、byte[] → Bitmap

 

复制代码
1     public Bitmap Bytes2Bimap(byte[] b) {
2 if (b.length != 0) {
3 return BitmapFactory.decodeByteArray(b, 0, b.length);
4 } else {
5 return null;
6 }
7 }
复制代码

 

4、Bitmap缩放

复制代码
 1     public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
2 int w = bitmap.getWidth();
3 int h = bitmap.getHeight();
4 Matrix matrix = new Matrix();
5 float scaleWidth = ((float) width / w);
6 float scaleHeight = ((float) height / h);
7 matrix.postScale(scaleWidth, scaleHeight);
8 Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
9 return newbmp;
10 }
复制代码

 

5、将Drawable转化为Bitmap

复制代码
 1 public static Bitmap drawableToBitmap(Drawable drawable) {
2 // 取 drawable 的长宽
3 int w = drawable.getIntrinsicWidth();
4 int h = drawable.getIntrinsicHeight();
5
6 // 取 drawable 的颜色格式
7 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
8 : Bitmap.Config.RGB_565;
9 // 建立对应 bitmap
10 Bitmap bitmap = Bitmap.createBitmap(w, h, config);
11 // 建立对应 bitmap 的画布
12 Canvas canvas = new Canvas(bitmap);
13 drawable.setBounds(0, 0, w, h);
14 // 把 drawable 内容画到画布中
15 drawable.draw(canvas);
16 return bitmap;
17 }
复制代码

 

6、获得圆角图片 

复制代码
 1     public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
2 int w = bitmap.getWidth();
3 int h = bitmap.getHeight();
4 Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
5 Canvas canvas = new Canvas(output);
6 final int color = 0xff424242;
7 final Paint paint = new Paint();
8 final Rect rect = new Rect(0, 0, w, h);
9 final RectF rectF = new RectF(rect);
10 paint.setAntiAlias(true);
11 canvas.drawARGB(0, 0, 0, 0);
12 paint.setColor(color);
13 canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
14 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
15 canvas.drawBitmap(bitmap, rect, rect, paint);
16
17 return output;
18 }
复制代码

 

7、获得带倒影的图片


复制代码
 1     public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
2 final int reflectionGap = 4;
3 int w = bitmap.getWidth();
4 int h = bitmap.getHeight();
5
6 Matrix matrix = new Matrix();
7 matrix.preScale(1, -1);
8
9 Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w,
10 h / 2, matrix, false);
11
12 Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2),
13 Config.ARGB_8888);
14
15 Canvas canvas = new Canvas(bitmapWithReflection);
16 canvas.drawBitmap(bitmap, 0, 0, null);
17 Paint deafalutPaint = new Paint();
18 canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);
19
20 canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);
21
22 Paint paint = new Paint();
23 LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
24 bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
25 0x00ffffff, TileMode.CLAMP);
26 paint.setShader(shader);
27 // Set the Transfer mode to be porter duff and destination in
28 paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
29 // Draw a rectangle using the paint with our linear gradient
30 canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()
31 + reflectionGap, paint);
32
33 return bitmapWithReflection;
34 }
复制代码

 

 三、Drawable

1、Bitmap转换成Drawable

1 Bitmap bm=xxx; //xxx根据你的情况获取
2 BitmapDrawable bd= new BitmapDrawable(getResource(), bm);
3 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。

2、Drawable缩放


复制代码
 1     public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
2 int width = drawable.getIntrinsicWidth();
3 int height = drawable.getIntrinsicHeight();
4 // drawable转换成bitmap
5 Bitmap oldbmp = drawableToBitmap(drawable);
6 // 创建操作图片用的Matrix对象
7 Matrix matrix = new Matrix();
8 // 计算缩放比例
9 float sx = ((float) w / width);
10 float sy = ((float) h / height);
11 // 设置缩放比例
12 matrix.postScale(sx, sy);
13 // 建立新的bitmap,其内容是对原bitmap的缩放后的图
14 Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
15 matrix, true);
16 return new BitmapDrawable(newbmp);
17 }
复制代码

本文转自dyh7077063的博客http://dyh7077063.iteye.com/blog/970672

android 图片处理工具类,Bitmap转换String ,Drawable, byte[],保存,优化等。

android 图片处理工具类,Bitmap转换String ,Drawable, byte[],保存,优化等。
  • yangbo437993234
  • yangbo437993234
  • 2015年01月27日 14:50
  • 2438

Android开发中Bitmap和Drawable的区别

- Drawable和Bitmap之间可以互相转换,Drawable占用内存远小于Bitmap。- setImageDrawable使用资源文件;setImageBitmap使用bitmap图片,该图...
  • liu537192
  • liu537192
  • 2015年08月14日 17:37
  • 1429

Activity之间传递图片(Drawable,Bitmap)

activity之间传递drawable(bitmap)图片
  • Json_Jerry
  • Json_Jerry
  • 2017年08月02日 16:24
  • 565

Android开发——Bitmap,byte[],Drawable相互转化

这几天开发中,遇到一个问题需要对Camera获取到的byte[] data进行转化为Bitmap,现做一笔记。在surfview中结合Camera获取到摄像头图像,这段代码是我程序中的一部分 @...
  • xidiancoder
  • xidiancoder
  • 2016年06月12日 22:28
  • 8847

Drawable和Bitmap的区别

Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好...
  • kazeik
  • kazeik
  • 2013年12月29日 20:59
  • 24281

Android将drawable图像转化为二进制字节数组与逆转换

首先是将图像转换为二进制字节数组进行存储 // ------------------------将drawable 图像转化成二进制字节---------------- public syn...
  • wx_962464
  • wx_962464
  • 2013年01月04日 22:38
  • 8276

android bitmap byte[] drawable互转

android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下: 1、Drawable → Bitmap Java代码 Java代码   public stat...
  • l241002209
  • l241002209
  • 2011年11月24日 17:30
  • 627

Android 中 Bitmap 和 Drawable 相互转换的方法

Drawable —> Bitmap 获取资源文件(Drawable)中的 Bitmap Resources res = getResources(); Bitmap bmp = BitmapF...
  • l_lhc
  • l_lhc
  • 2016年03月18日 14:42
  • 21195

Android常用的Drawable和Bitmap之间的转化方法

bitmap和Drawable间的区别: Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明...
  • zw904448290
  • zw904448290
  • 2016年11月07日 18:45
  • 8801

Android中Drawable与Bitmap相互转换的方法

1..Bitmap转Drawable Drawable drawable =new BitmapDrawable(bmp); 2.Drawable转Bitmap ...
  • baidu_33512336
  • baidu_33512336
  • 2017年04月09日 11:12
  • 680
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安卓图片操作:drawable、bitmap、byte[]之间互转,以及drawable的操作
举报原因:
原因补充:

(最多只允许输入30个字)