Bitmap,byte[],Drawable相互转化
1、Drawable就是一个可画的对象。其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable)。还有可能是一个图层(LayerDrawable),我们依据绘图的需求,创建对应的可画对象
2、Canvas画布,画图的目的区域,用于画图
3、Bitmap位图,用于图的处理
4、Matrix矩阵
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 }
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 }
版权声明:本文博主原创文章。博客,未经同意不得转载。
Bitmap,byte[],Drawable相互转化的更多相关文章
- Android中Bitmap,byte[],Drawable相互转化
一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...
- 【Android】[转] Android中Bitmap,byte[],Drawable相互转化
一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...
- 【转】Drawable /Bitmap、String/InputStream、Bitmap/byte[]
原文:http://wuxiaolong.me/2015/08/10/Drawable-to-Bitmap/ Drawable互转Bitmap Drawable转Bitmap 1234 Resourc ...
- Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】
package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...
- Bitmap byte[] InputStream Drawable 互转
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStrea ...
- byte[],bitmap,drawable之间的相互转换
Byte[]转Bitmap BitmapFactory.decodeByteArray(data, 0, data.length); Bitmap转Byte[] ByteArrayOutputStre ...
- Android中Bitmap、Drawable、byte[]转换
public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out = new ByteArrayOutputStream(); ...
- C# Bitmap类型与Byte[]类型相互转化
Bitmap => byte[] Bitmap b = new Bitmap( "test.bmp "); MemoryStream ms = new Memory ...
- bitmap和drawable的相互转化以及setImageResource(),setImageDrawable(),setImageBitmap()
从本地获取drawable图片:getResources().getDrawable(R.drawable.**) 获取bitmap:Bitmap b=BitmapFactory().decodeRe ...
随机推荐
- SpringMVC响应Ajax请求(@Responsebody注解返回页面)
项目需求描述:page1中的ajax请求Controller,Controller负责将service返回的数据填充到page2中,并将page2整个页面返回到page1中ajax的回调函数. 一句话 ...
- php gettext方式实现UTF-8国际化多语言(i18n)
php gettext方式实现UTF-8国际化多语言(i18n) 一.总结 一句话总结: 二.php gettext方式实现UTF-8国际化多语言(i18n) 近 来随着i18n(国际化)的逐渐标准化 ...
- 像Bootstrap一样比较热门的前端框架有哪些
像Bootstrap一样比较热门的前端框架有哪些 一.总结 一句话总结:框架大同小异,可以多去各自官网看看效果(比较一下各自的不同点(也就是提供的不同的功能)),然后根据需求选择用哪个.我觉得boot ...
- apache-spark导入eclipse环境
工作中用到了apache-spark,想深入了解一下,决定从源码开始. 先导入到常用的ide,eclipse吧: 准备工作 1. 下载Eclipse:http://scala-ide.org/ 2. ...
- POJ 2479 Maximum sum POJ 2593 Max Sequence
d(A) = max{sum(a[s1]..a[t1]) + sum(a[s2]..a[t2]) | 1<=s1<=t1<s2<=t2<=n} 即求两个子序列和的和的最大 ...
- Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手
图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...
- PostgreSQL 序列
PostgreSQL 中的序列是一个数据库对象,本质上是一个自增器.因此,序列在其他同类型数据库软件中以 autoincrment 值的形式存在.在一张表需要非随机,唯一标实符的场景下,Sequenc ...
- AndroidAnnotations使用说明书—AndroidAnnotations是怎样工作的?
AndroidAnnotations的工作方式非常easy.它使用标准的java注入处理工具,自己主动加入了一个额外的编译步骤来生成源码. 源代码是什么?每个增强的类,比方每个用@EActivity注 ...
- SpringBoot 使用 @Value 从 YAML文件读取属性(转)
在 YAML中有如下配置 paypal: mode:live 在类中,通过 @Value属性读取 @Value("${paypal.mode}") private String m ...
- PHP+Aax实现异步验证
利用Ajax技术来检测用户名是否存在的原理流程图: 最终结果截图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...