一、相关概念

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】[转] Android中Bitmap,byte[],Drawable相互转化的更多相关文章

  1. Android中Bitmap,byte[],Drawable相互转化

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  2. Bitmap,byte[],Drawable相互转化

    1.Drawable就是一个可画的对象.其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable).还有可能是一个图层(LayerDrawable),我们依据绘图 ...

  3. Android图片二进制与Bitmap、Drawable之间的转换

    Android图片二进制与Bitmap.Drawable之间的转换 Java代码  public byte[] getBitmapByte(Bitmap bitmap){      ByteArray ...

  4. Android中Bitmap、Drawable、byte[]转换

    public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out = new ByteArrayOutputStream(); ...

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

    1.Drawable->Bitmap Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res, R.d ...

  6. Android中Bitmap和Drawable

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  7. Android中Bitmap和Drawable,等相关内容

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  8. Android中Bitmap和Drawable详解

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  9. [转载]Android中Bitmap和Drawable

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

随机推荐

  1. mac下配置openCV

    预备工作: 1.下载Homebrew  在Terminal中输入: ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)" ...

  2. UIAlertController 使用

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...

  3. 【TextBox】重写右键菜单

    参考资料 http://bbs.csdn.net/topics/390324356 http://www.cnblogs.com/ycxy/archive/2012/10/09/2716852.htm ...

  4. 批量修改vss工作目录

    vss作为源代码版本控制工具,可以针对不同的文件夹设置不同的本地工作目录,这样可以方便我们不同的个性化需求.但是往往实际情况是,我们设置了不同的工作目录,后来却发现导致引用混乱,每个人每次获取项目文件 ...

  5. CoinPunk项目介绍

           CoinPunk是一个bitcoin比特币钱夹服务web应用程序,你可以自己构建钱夹服务.开源,免费. 轻量级,高效 响应式设计 轻易创建新账户 详细的交易记录 构建于Node.js与H ...

  6. CentOs 7怎么联网

    在安装好Centos7后,网络还不能正常使用,需要我们手动配置.并且Linux的网络配置并不太容易,新手经常不知道从何开始.为了解决这个令大家头疼的问题,我在此将成功的配置过程与大家分享.希望大家都能 ...

  7. Boyer-Moore 字符串匹配算法

    字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字 ...

  8. Javascript图片裁切

    最近浏览了不少网站的图片裁切效果,大部分的做法如下图所示(借用一张脚本之家的图片),通过改变裁切框的大小来选取合适的位置. 但本文介绍的是另外一种裁切方式,裁切框由开发者决定,图片大小由用户决定,通过 ...

  9. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  10. FusionCharts简单教程(三)-----FusionCharts的基本属性

          通过前面两章的讲解我们可以制作出简单的图像,但是有时候我们需要对图像进行一个精确的规划,比如设置背景颜色.设置提示信息.设置间隔颜色等等,这时就需要我们对FusionCharts的细节有比 ...