16位RGB565格式图像数据存储为bmp文件

银河修理员- 2017-05-11 02:54:02
想把下位机传上来的16位RGB565格式图像数据存储为bmp文件,看着网上一些程序改的,不知道哪里写错了,保存后图象显示不对,求指导,谢谢

代码如下:
WORD width = 160;
WORD height = 160;
BITMAPFILEHEADER bmfHdr; //定义文件头
BITMAPINFOHEADER bmiHdr; //定义信息头
RGBQUAD bmiClr[3]; //定义调色板

bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
bmiHdr.biWidth = width;//指定图像的宽度,单位是像素
bmiHdr.biHeight = -height;//指定图像的高度,单位是像素
bmiHdr.biPlanes = 1;//目标设备的级别,必须是1
bmiHdr.biBitCount = 16;//表示用到颜色时用到的位数 16位表示高彩色图
bmiHdr.biCompression = BI_BITFIELDS;//BI_RGB仅有RGB555格式
bmiHdr.biSizeImage = (width * height * 2);//指定实际位图所占字节数
bmiHdr.biXPelsPerMeter = 0;//水平分辨率,用象素/米表示。
bmiHdr.biYPelsPerMeter = 0;//垂直分辨率,用象素/米表示。
bmiHdr.biClrUsed = 0;//位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)
bmiHdr.biClrImportant = 0;//说明对图象显示有重要影响的颜色索引的数目,0表示所有颜色都重要

//RGB565格式掩码
bmiClr[0].rgbBlue = 0;
bmiClr[0].rgbGreen = 0xF8;
bmiClr[0].rgbRed = 0;
bmiClr[0].rgbReserved = 0;

bmiClr[1].rgbBlue = 0xE0;
bmiClr[1].rgbGreen = 0x07;
bmiClr[1].rgbRed = 0;
bmiClr[1].rgbReserved = 0;

bmiClr[2].rgbBlue = 0x1F;
bmiClr[2].rgbGreen = 0;
bmiClr[2].rgbRed = 0;
bmiClr[2].rgbReserved = 0;


bmfHdr.bfType = (WORD)0x4D42;//文件类型,0x4D42也就是字符'BM'
bmfHdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 3 + width * height * 2);//文件大小
bmfHdr.bfReserved1 = 0;//保留,必须为0
bmfHdr.bfReserved2 = 0;//保留,必须为0
bmfHdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * 3);//实际图像数据偏移量

CFile fp;
fp.Open("d:\\Model.bmp", CFile::modeCreate | CFile::modeWrite);
fp.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER)); // 写文件头
fp.Write((LPSTR)&bmiHdr, sizeof(BITMAPINFOHEADER)); // 写信息头
fp.Write((LPSTR)&bmiClr, sizeof(RGBQUAD) * 3);
fp.Write((LPSTR)CameraData, width * height * 2);// 写数据
fp.Close();

...全文
1724 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44002476 2019-12-01
  • 打赏
  • 举报
回复
我能肯定,还原的程序没有错,现在主要的问题就在RGB565的数据这里,在串口调试助手上,我接收到的数据大小是正确的,但就是不知道为什么我保存后,还原就出错了,您能给点建议吗/
weixin_44002476 2019-12-01
  • 打赏
  • 举报
回复
我能肯定,还原的程序没有错,现在主要的问题就在RGB565的数据这里,在串口调试助手上,我接收到的数据大小是正确的,但就是不知道为什么我保存后,还原就出错了,您能给点建议吗/
控制工程小孩 2019-10-23
  • 打赏
  • 举报
回复
您好,请问一下图像数据是什么样的,是数组形式C语言格式,还是txt格式,中间用逗号隔开吗?还是用空格隔开?
weixin_41040311 2019-07-23
  • 打赏
  • 举报
回复
楼主在将16位像素点当成是32位的如何修改的
高调的菜鸟 2017-10-30
  • 打赏
  • 举报
回复
你好,可以请问下你是怎么把RGB565转位bmp的吗,能看下代码吗
v2gldidiao 2017-10-02
  • 打赏
  • 举报
回复
楼主是用C语言写的么,我现在正在学 想要把保存的rjb565 16位 bmp图片指针储存为文件,想向楼主您请教
银河修理员- 2017-05-12
  • 打赏
  • 举报
回复
应该说是数据类型定义的时候弄错了 小错误 哎
银河修理员- 2017-05-12
  • 打赏
  • 举报
回复
已找到原因,16位的像素点被当成是32位的了
赵4老师 2017-05-12
  • 打赏
  • 举报
回复
BMP要求每行像素数据的字节数必须是4的倍数,如果不是,补1~3个字节0
图灵狗 2017-05-11
  • 打赏
  • 举报
回复
看起来像是每行的数据没有对齐,应该是少了一些像素或者是对齐数据。
引用 2 楼 kid229305772 的回复:
[quote=引用 1 楼 turingo 的回复:] 可以发一下两张图片的对比。
红框内的图像就是要显示的部分 实际保存后的图像 [/quote]
银河修理员- 2017-05-11
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
可以发一下两张图片的对比。


红框内的图像就是要显示的部分



实际保存后的图像
图灵狗 2017-05-11
  • 打赏
  • 举报
回复
可以发一下两张图片的对比。

65,207

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧