16位图像数据如何保存为24位bmp图像

alieenyaya 2010-10-22 04:19:00
RT
...全文
416 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
eastgeneral 2012-12-30
  • 打赏
  • 举报
回复
学习了,正是我在找的资料
libinfei8848 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tufaqing 的回复:]
16位图像分好多种的,常见的是RGB555,RGB565,先要把RGB的值分析出来,再保存为RGB24,bmp取RGB的代码参考我的回复代码:http://topic.csdn.net/u/20101021/14/883f47a4-8bcb-48c5-8e48-93a41ed3d452.html
下面是保存为RGB24的代码:

C/C++ code

BOOL CImageProces……
[/Quote]
不错不错
alieenyaya 2010-10-22
  • 打赏
  • 举报
回复
我知道了 是YUV2格式,其实我是通过vfw通过回调函数得到的每一帧的视频图像的数据的,我不想用vfw自身的保存位图的函数来实现,想自己编一个,所以 现在就遇到了这样的问题:
YUV2格式的16位图像数据如何保存为24位bmp图
tufaqing 2010-10-22
  • 打赏
  • 举报
回复
上面的mask是对应RGB在16位bit上占用的第几个bit位,R是高5位,G中6位,B低5位,就是RGB565。
biCompression = 844715353 = 0x32595559 = 'YUY2',你这不是RGB的图像,是YUV的,要了解一下YUY2的排列,YUY2是16bit的,将YUV转换成RGB保存才行。这些可以在维基或百度百科上参考学习。
alieenyaya 2010-10-22
  • 打赏
  • 举报
回复
我知道了 是YUV2格式,其实我是通过vfw通过回调函数得到的每一帧的视频图像的数据的,我不想用vfw自身的保存位图的函数来实现,想自己编一个,所以 现在就遇到了这样的问题:
YUV2格式的16位图像数据如何保存为24位bmp图
alieenyaya 2010-10-22
  • 打赏
  • 举报
回复
WORD nRMask = 0x7c00;
WORD nGMask = 0x03e0;
WORD nBMask = 0x001f;
这是什么意思,我读出来的biCompression的值是844715353,那图像是什么样的压缩格式啊
百事烟 2010-10-22
  • 打赏
  • 举报
回复
16bit buf + 16bit BITMAPINFO + 调色板 合成 16bit 位图

16bit 位图 可直接保存至 24bit位图 (GDI+ 或各种图像库都有现成的函数)
tufaqing 2010-10-22
  • 打赏
  • 举报
回复
16位图像分好多种的,常见的是RGB555,RGB565,先要把RGB的值分析出来,再保存为RGB24,bmp取RGB的代码参考我的回复代码:http://topic.csdn.net/u/20101021/14/883f47a4-8bcb-48c5-8e48-93a41ed3d452.html
下面是保存为RGB24的代码:

BOOL CImageProcessor::SaveFile24(HANDLE hFile)
{
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
memset(&bmfh, 0, sizeof(bmfh));
memset(&bmih, 0, sizeof(bmih));

int nBitmapSize = abs(m_bmih.biHeight) * WIDTHBYTES(m_bmih.biWidth * 24);

bmfh.bfType = 'MB';
bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih);
bmfh.bfSize = bmfh.bfOffBits + nBitmapSize;

bmih.biSize = sizeof(bmih);
bmih.biWidth = m_bmih.biWidth;
bmih.biHeight = m_bmih.biHeight;
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = nBitmapSize;

BYTE *pData = new BYTE[nBitmapSize];
memset(pData, 0, nBitmapSize);

BYTE *pR = m_pR;
BYTE *pG = m_pG;
BYTE *pB = m_pB;

for(int j = 0; j < abs(bmih.biHeight); j++)
{
BYTE *pTemp = pData + WIDTHBYTES(bmih.biWidth * 24) * j;

for(int i = 0; i < bmih.biWidth; i++)
{
*pTemp++ = *pB++;
*pTemp++ = *pG++;
*pTemp++ = *pR++;
}
}

DWORD dwByteWritten = 0;
::WriteFile(hFile, &bmfh, sizeof(bmfh), &dwByteWritten, NULL);
::WriteFile(hFile, &bmih, sizeof(bmih), &dwByteWritten, NULL);
::WriteFile(hFile, pData, nBitmapSize, &dwByteWritten, NULL);

delete[] pData;

return TRUE;
}
laincastle 2010-10-22
  • 打赏
  • 举报
回复
PHOTOSHOP

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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