关于大的Bitmap保存问题

截取一帧640x480的bitmap,然后通过下面方式进行保存:

try {
fos = new FileOutputStream(f);
Bitmap frame = Bitmap.createBitmap(SRV1VideoCommand.bframe, 0, 0, 640, 480, matrix, false);
if(frame.compress(Bitmap.CompressFormat.PNG, 100, fos)){
fos.flush();
fos.close();
}
}
catch (FileNotFoundException e) {e.printStackTrace();}
catch (IOException e) {e.printStackTrace();}

但执行到下面这一句时就停在这里了,也没什么错误信息输出:

frame.compress(Bitmap.CompressFormat.PNG, 100, fos)

但如果改成:

frame.compress(Bitmap.CompressFormat.JPEG, 90, fos)

则可以保存成功,但反复操作几次之后又不响应了。

具体原因不太清楚,应该是与数据量有关。因为当指定PNG格式进行保存时,第二个“图片质量”参数其实是不起作用的,因为PNG没有压缩,所以数据量比较大。
当使用JPEG时,第二个“图片质量”参数90就起作用了,图片会小很多。

PNG格式与JPEG的100质量参数效果是一样的。

如测试的是320x240图像,则保存PNG毫无压力;测试发现:
1. 图片质量设为100,一副320x240的图像保存成文件大概30K
2. 图片质量设为90,一副320x240的图像保存成文件大概10K

由此可见,质量降低到90,图片数据量会减少很多,所以对于上面的640x480图像在设置成90参数的JPEG后就可以正确保存了。连续执行几次后可能由于资源释放不即时导致后面又不响应了。。。

虽然这只是猜测,但大的bitmap保存不成功肯定是与数据量有关的。

转载于:https://www.cnblogs.com/wzc0066/archive/2013/03/07/2948364.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将位图保存为 BMP 格式,可以使用以下步骤: 1. 创建一个 BITMAPFILEHEADER 结构体,用于保存 BMP 文件头信息。 2. 创建一个 BITMAPINFOHEADER 结构体,用于保存位图信息头。 3. 计算位图像素数据的大小,用于分配内存。 4. 将位图像素数据按照 BMP 文件格式存储到内存中。 5. 将 BITMAPFILEHEADER 和 BITMAPINFOHEADER 写入 BMP 文件开头。 6. 将位图像素数据写入 BMP 文件中。 以下是一个示例代码,用于将位图保存为 BMP 格式: ```c++ #include <fstream> #include <iostream> #include <vector> #include <cstring> using namespace std; #pragma pack(push, 1) // BMP 文件头 typedef struct { uint16_t bfType; // 文件类型,必须为 BM uint32_t bfSize; // 文件大小,单位为字节 uint16_t bfReserved1; // 保留字段,必须为 0 uint16_t bfReserved2; // 保留字段,必须为 0 uint32_t bfOffBits; // 位图数据的起始位置,单位为字节 } BITMAPFILEHEADER; // BMP 位图信息头 typedef struct { uint32_t biSize; // 信息头大小,必须为 40 int32_t biWidth; // 图像宽度,单位为像素 int32_t biHeight; // 图像高度,单位为像素 uint16_t biPlanes; // 位平面数,必须为 1 uint16_t biBitCount; // 每像素位数,一般为 24 uint32_t biCompression; // 压缩方式,一般为 0 uint32_t biSizeImage; // 图像数据大小,单位为字节 int32_t biXPelsPerMeter; // 水平分辨率,单位为像素/meter int32_t biYPelsPerMeter; // 垂直分辨率,单位为像素/meter uint32_t biClrUsed; // 颜色数,一般为 0 uint32_t biClrImportant; // 重要颜色数,一般为 0 } BITMAPINFOHEADER; #pragma pack(pop) // 将位图保存为 BMP 格式 bool save_bitmap(const char *filename, const uint8_t *data, int width, int height) { // 计算位图像素数据大小 int data_size = width * height * 3; // 创建 BMP 文件头 BITMAPFILEHEADER file_header; memset(&file_header, 0, sizeof(file_header)); file_header.bfType = 0x4D42; // "BM" file_header.bfSize = sizeof(file_header) + sizeof(BITMAPINFOHEADER) + data_size; file_header.bfOffBits = sizeof(file_header) + sizeof(BITMAPINFOHEADER); // 创建 BMP 位图信息头 BITMAPINFOHEADER info_header; memset(&info_header, 0, sizeof(info_header)); info_header.biSize = sizeof(info_header); info_header.biWidth = width; info_header.biHeight = height; info_header.biPlanes = 1; info_header.biBitCount = 24; info_header.biSizeImage = data_size; // 打开文件并写入 BMP 文件头和位图信息头 ofstream outfile(filename, ios::binary); if (!outfile) { cerr << "Failed to open file: " << filename << endl; return false; } outfile.write(reinterpret_cast<const char*>(&file_header), sizeof(file_header)); outfile.write(reinterpret_cast<const char*>(&info_header), sizeof(info_header)); // 写入位图像素数据 outfile.write(reinterpret_cast<const char*>(data), data_size); outfile.close(); return true; } ``` 这个函数需要传入一个指向位图像素数据的指针,以及位图的宽度和高度。函数将位图保存为 BMP 格式,并返回一个布尔值表示保存是否成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值