
Android bitmap转BMP格式图片实现
83KB |
更新于2024-09-01
| 14 浏览量 | 3 评论 | 举报
收藏
"在Android应用开发中,将Bitmap对象转换为BMP格式的图片文件是一项常见的需求。然而,Android SDK并没有直接提供支持BMP格式的`compress()`方法。本示例代码将展示如何通过自定义实现来将Bitmap保存为BMP格式的文件。"
在Android开发中,处理图像时可能会遇到需要将Bitmap对象存储为不同格式的需求,例如JPEG、PNG或BMP。JPEG和PNG格式因为Android SDK提供了内置的支持,因此可以直接使用`Bitmap.compress()`方法轻松完成。但当需要保存为BMP(位图)格式时,由于SDK中并未直接提供此功能,开发者需要自行实现写入BMP文件的逻辑。
以下是一个简单的示例,展示了如何在Android应用中将Bitmap转换为BMP文件:
```java
package com.test.bitmap;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
ImageView img;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.sd);
img = (ImageView) findViewById(R.id.img1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 获取Bitmap
Bitmap bitmap = getBitmapFromImageView(img);
// 保存为BMP文件
saveBitmapAsBMP(bitmap, "myBMP.bmp");
}
});
}
// 从ImageView获取Bitmap
private Bitmap getBitmapFromImageView(ImageView imageView) {
// 实现逻辑,这里省略
}
// 将Bitmap保存为BMP文件
private void saveBitmapAsBMP(Bitmap bitmap, String fileName) {
try {
FileOutputStream out = new FileOutputStream(
Environment.getExternalStorageDirectory().getPath()
+ File.separator + fileName);
writeBitmapToBMP(bitmap, out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 写Bitmap到BMP文件
private void writeBitmapToBMP(Bitmap bitmap, FileOutputStream out)
throws IOException {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
// BMP文件头信息
byte[] header = new byte[54];
// 文件类型标识
header[0] = 'B';
header[1] = 'M';
// 文件大小(包括文件头)
long fileSize = 54 + (width * height * 3); // RGB三通道
header[2] = (byte) (fileSize & 0xFF);
header[3] = (byte) ((fileSize >> 8) & 0xFF);
header[4] = (byte) ((fileSize >> 16) & 0xFF);
header[5] = (byte) ((fileSize >> 24) & 0xFF);
// 保留字段
header[6] = 0;
header[7] = 0;
// 数据偏移量,从文件头到数据区的字节数
header[10] = (byte) (54 & 0xFF);
header[11] = (byte) ((54 >> 8) & 0xFF);
header[12] = (byte) ((54 >> 16) & 0xFF);
header[13] = (byte) ((54 >> 24) & 0xFF);
// 图像信息头大小
header[14] = (byte) (40 & 0xFF);
header[15] = (byte) ((40 >> 8) & 0xFF);
// 图像宽度
header[18] = (byte) (width & 0xFF);
header[19] = (byte) ((width >> 8) & 0xFF);
header[20] = (byte) ((width >> 16) & 0xFF);
header[21] = (byte) ((width >> 24) & 0xFF);
// 图像高度
header[22] = (byte) (height & 0xFF);
header[23] = (byte) ((height >> 8) & 0xFF);
header[24] = (byte) ((height >> 16) & 0xFF);
header[25] = (byte) ((height >> 24) & 0xFF);
// 颜色平面数量,始终为1
header[26] = 1;
// 每像素位数,BMP默认为24位
header[28] = 24;
// 压缩方式,0表示无压缩
header[30] = 0;
// 图像大小,不压缩时等于宽度*高度*位深度/8
long imageSize = width * height * 3;
header[34] = (byte) (imageSize & 0xFF);
header[35] = (byte) ((imageSize >> 8) & 0xFF);
header[36] = (byte) ((imageSize >> 16) & 0xFF);
header[37] = (byte) ((imageSize >> 24) & 0xFF);
// X像素每米
header[38] = (byte) (2835 & 0xFF); // 72 dpi
header[39] = (byte) ((2835 >> 8) & 0xFF);
// Y像素每米
header[40] = (byte) (2835 & 0xFF);
header[41] = (byte) ((2835 >> 8) & 0xFF);
// 颜色表大小,24位无需颜色表
header[42] = 0;
header[43] = 0;
// 重要颜色数,24位颜色时为0
header[44] = 0;
header[45] = 0;
out.write(header);
// 写像素数据
for (int y = height - 1; y >= 0; y--) {
for (int x = 0; x < width; x++) {
int color = bitmap.getPixel(x, y);
out.write((color & 0xFF)); // B
out.write(((color >> 8) & 0xFF)); // G
out.write(((color >> 16) & 0xFF)); // R
}
}
}
}
```
这段代码首先创建一个54字节的BMP文件头,并填充必要的信息,如文件大小、数据偏移量、图像尺寸、位深度等。然后,它按照BMP格式的顺序(从下往上,从左往右)写入像素数据。注意,BMP格式的像素数据是按BGR顺序排列的,而不是Android中的ARGB。
在实际应用中,可能需要根据具体需求进行调整,比如处理Alpha通道、添加色彩表或者处理其他BMP版本的细节。但这个基础示例可以作为一个起点,帮助理解如何手动将Bitmap转换为BMP格式。
相关推荐


















资源评论

阿葱的葱白
2025.05.18
这篇文档详细讲解了如何在Android环境下将bitmap保存为BMP格式,解决了一个开发中的常见难题。🌍

士多霹雳酱
2025.05.03
文章虽然缺乏现成的API支持,但作者通过自己的研究,分享了实用的代码示例。

KerstinTongxi
2025.04.28
对于需要在Android中保存BMP图片的开发者来说,这篇文章提供了一个难得的解决方案。

weixin_38713586
- 粉丝: 3
最新资源
- AngularJS代码单元测试全面教程
- ngx-codemirror:适用于Angular 6+和SSR的CodeMirror代码编辑器
- SSH远程环境URL本地浏览器便捷打开解决方案
- WPF滑块控件扩展:带有刻度标记的自定义标签
- CAMIKraken: Kraken元基因分类器的Docker化与脚本封装
- Docker 构建 Jenkins NodeJS 从站容器教程
- Paper.js:HTML5 Canvas矢量图形脚本编写框架解析
- Vue.js可访问性资源集合:从路由到表单验证
- Ruby ParseConfig库:简化Unix/Linux配置文件解析
- PyTorch实现PointNet:3D点云数据深度学习分类与分割
- Go语言实现X11哈希算法及功能展示
- Spark与Kafka集成实践:在本地使用Docker模拟生产环境
- 网新企业网站管理系统v1.2:智能化网站建设解决方案
- Econfig:轻松管理Ruby应用配置的工具
- Node.js中简易docker Registry客户端的实现与应用
- Vulture网络引擎:开源CMS解决方案
- GitHub端点快速查找工具:github-endpoints使用指南
- 基于Hyperledger Fabric实现UTXO模型的技术探讨
- Android应用开发组合展示:我的Android Nanodegree学习之旅
- OpenAPI规范集成与文档自动生成指南
- jucaBox: 构建Web应用程序的新起点
- naturalearthtiles项目介绍:免费使用自然地球矢量和栅格图块
- 使用Hyperledger Fabric学习链式编码与应用开发
- 迅速防范木马攻击:一键关闭危害端口bat脚本