Android图像处理:Drawable、Bitmap与byte[]转换实战
需积分: 50 129 浏览量
更新于2024-09-15
收藏 33KB DOC 举报
本文档详细阐述了Android平台中如何在Drawable、Bitmap和byte数组之间进行转换,这些转换在Android应用开发中尤其常见,涉及到图片资源的处理和存储。
在Android开发中,处理图像资源时,我们经常需要在不同的数据类型间进行转换。以下是三种主要类型的转换方法:
1. Drawable → Bitmap
当需要将一个Drawable对象转换为Bitmap以便进行进一步的图像操作时,可以使用以下Java代码:
```java
public static Bitmap drawableToBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap.Config config = (drawable.getOpacity() != PixelFormat.OPAQUE) ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(bitmap);
// canvas.setBitmap(bitmap); // 这行代码通常是不必要的,因为Canvas构造函数已经关联了Bitmap
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}
```
这段代码首先根据Drawable的固有尺寸创建一个Bitmap对象,并根据Drawable的不透明度选择合适的配置(ARGB_8888或RGB_565)。然后在Canvas上绘制Drawable到Bitmap中。
2. 从资源中获取Bitmap
如果图片资源存储在应用的资源文件夹下,可以使用BitmapFactory的decodeResource方法来获取Bitmap:
```java
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.your_image_resource_id);
```
这里的`R.drawable.your_image_resource_id`是对应图片资源的ID。
3. Bitmap → byte[]
将Bitmap转换为byte数组,便于存储或网络传输,可以这样实现:
```java
public static byte[] bitmapToBytes(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); // 使用PNG格式压缩,100表示不压缩
return baos.toByteArray();
}
```
这段代码创建了一个ByteArrayOutputStream,然后调用Bitmap的compress方法将Bitmap以PNG格式压缩到这个输出流中,最后将流转换成byte数组。
4. byte[] → Bitmap
反向转换,将byte数组还原为Bitmap:
```java
public static Bitmap bytesToBitmap(byte[] bytes) {
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
```
这里使用BitmapFactory的decodeByteArray方法解析byte数组并创建Bitmap对象。
了解和熟练掌握这些转换方法对于Android开发者来说至关重要,因为它们能够帮助优化内存管理,处理图片资源,以及在内存和磁盘之间高效地移动图像数据。在处理大量图片或低内存设备上,正确地转换和管理这些数据类型对于应用性能和用户体验具有深远影响。
2015-01-07 上传
2014-04-25 上传
2023-07-16 上传
2023-06-05 上传
2022-09-20 上传
2012-06-08 上传
2012-06-08 上传
2015-08-24 上传
fql_zlyy
- 粉丝: 3
- 资源: 7
最新资源
- 构建基于Django和Stripe的SaaS应用教程
- Symfony2框架打造的RESTful问答系统icare-server
- 蓝桥杯Python试题解析与答案题库
- Go语言实现NWA到WAV文件格式转换工具
- 基于Django的医患管理系统应用
- Jenkins工作流插件开发指南:支持Workflow Python模块
- Java红酒网站项目源码解析与系统开源介绍
- Underworld Exporter资产定义文件详解
- Java版Crash Bandicoot资源库:逆向工程与源码分享
- Spring Boot Starter 自动IP计数功能实现指南
- 我的世界牛顿物理学模组深入解析
- STM32单片机工程创建详解与模板应用
- GDG堪萨斯城代码实验室:离子与火力基地示例应用
- Android Capstone项目:实现Potlatch服务器与OAuth2.0认证
- Cbit类:简化计算封装与异步任务处理
- Java8兼容的FullContact API Java客户端库介绍