android开发之Bitmap 、byte[] 、 Drawable之间的相互转换
一、相关概念
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 }
android开发之Bitmap 、byte[] 、 Drawable之间的相互转换的更多相关文章
- byte[],bitmap,drawable之间的相互转换
Byte[]转Bitmap BitmapFactory.decodeByteArray(data, 0, data.length); Bitmap转Byte[] ByteArrayOutputStre ...
- android开发之bitmap使用
bitmap是android中重要的图像处理工具类,通过bitmap可以对图像进行剪切.旋转.缩放等操作,同时还可以指定格式和压缩质量保存图像文件. 一.拿到一个Bitmap对象 查看源码我们知道,B ...
- Android开发之Bitmap.Config.RGB_565
在学习xutils框架的时候,看到sample代码中有一行这样的代码: bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565); Bi ...
- 【转】Android开发之Bitmap的内存优化详解
本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...
- Android开发之Bitmap二次采样
Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题. 1.为什么要二次采样 OK,那么首先我要 解决的一个问题就是为什么我们要二次采样? 不知 ...
- Android开发之Bitmap的高效加载
BitmapFactory类提供了四类方法:decodeFile, decodeResource, decodeStream和decodeByteArray 分别用于支持从文件系统,资源,输入流以及字 ...
- Android图片二进制与Bitmap、Drawable之间的转换
Android图片二进制与Bitmap.Drawable之间的转换 Java代码 public byte[] getBitmapByte(Bitmap bitmap){ ByteArray ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
随机推荐
- hdu 4068 I-number【大数】
题目: http://acm.hdu.edu.cn/showproblem.php?pid=4608 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- PAT 1063. 计算谱半径(20)
在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界.换言之,对于给定的n个复数空间的特征值{a1+b1i, ..., an+bni},它们的模为实部与虚部的平方和的开方,而“谱半径”就是最大模. ...
- java线程 同步临界区:thinking in java4 21.3.5
java线程 同步临界区:thinking in java4 21.3.5 thinking in java 4免费下载:http://download.csdn.net/detail/liangru ...
- java 从零开始 第三天
2015年5月2日 51刚过一天,电脑坏了.不开心,就没有更新了 Java中的类型转换 自动类型 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型 ...
- Windows下重置MySQL密码(最开始是因为Access denied for user 'root'@'localhost'这个原因,无法登陆 'root'@'localhost')
本人使用的MySQL5.5,其他版本未测试过. 方法一: 更改密码: mysql -u root -p Enter password:*** mysql>use mysql; 选择数据库 Dat ...
- ARDUINO W5100 WebServer测试
1.直接下载官方的enternet->WebServer代码 /* Web Server A simple web server that shows the value of the anal ...
- STM32 ~ J-LINK V8 修复
1.1 安装固件烧录软件 ♦请ATMEL官方网址下载AT91-ISP下载软件. 软件下载地址:http://www.atmel.com/dyn/products/tools_card.asp?t ...
- LeetCode:删除排序链表中的重复元素【83】
LeetCode:删除排序链表中的重复元素[83] 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示 ...
- Android TableLayout 表格布局
TableLayout继承LinearLayout 有多少个TableRow对象就有多少行, 列数等于最多子控件的TableRow的列数 直接在TableLayout加控件,控件会占据一行 Table ...
- 0523 CSS知识点
高级选择器分为:后代选择器.子代选择器.并集选择器.交集选择器 后代选择器 使用空格表示后代选择器.顾名思义,父元素的后代(包括儿子,孙子,重孙子) .father .item .a p{color: ...