100分求解从文件读出来的图像会是这样的!求帮助!求解决!

u010225776 2013-04-09 03:22:38
CreateDIBSection(dc, (BITMAPINFO *)&Header, DIB_RGB_COLORS, &Bits, NULL, 0);

创建一幅DIB位图,再从文件中得到数据填充到Bits中,


SelectObject(hMemDC, hbm);
BitBlt(g_hdc, 0, 0, 800, 600, hMemDC, 0, 0, SRCCOPY);
显示出来的时候是这样的:




也觉得是BGR的问题,不过我尝试着:

for (int i = 0; i+3 < bitmap.bmWidth * bitmap.bmHeight * 3; i+=3)
{
row_tmp2[i] = row_tmp[i+3];
row_tmp2[i+2] = row_tmp[i+2];
row_tmp2[i+3] = row_tmp[i];
}

memcpy(Bits, row_tmp2, bitmap.bmWidth * bitmap.bmHeight * 3);


再去显示,结果是这样的:




ps:请问,这是咋回事?要怎样处理DIB图像才能正确显示出来!跪求各位的帮助!谢谢哈
...全文
162 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010225776 2013-04-09
  • 打赏
  • 举报
回复
引用 11 楼 zengraoli 的回复:
C/C++ code?12345678 for (int i = 0; i+3 < bitmap.bmWidth * bitmap.bmHeight * 3; i+=3) {// row_tmp2[i] = row_tmp[i+3];// row_tmp2[i+2] = row_tmp[i+2];// row_t……
改好了,谢谢!
u010225776 2013-04-09
  • 打赏
  • 举报
回复
引用 8 楼 lostying 的回复:
话说你就把BITMAPINFOHEADER的内容贴出来让斑竹看看呗,还有上下倒不是左右倒
我擦 真的是,结贴!
  • 打赏
  • 举报
回复

    for (int i = 0; i+3 < bitmap.bmWidth * bitmap.bmHeight * 3; i+=3)
    {
//         row_tmp2[i] = row_tmp[i+3];
//         row_tmp2[i+2] = row_tmp[i+2];
//         row_tmp2[i+3] = row_tmp[i];
        // BITMAP是倒着来的,从下往上写
        row_tmp2[i] = row_tmp[bitmap.bmWidth * bitmap.bmHeight * 3];
    }
注意看这里的 // row_tmp2[i] = row_tmp[i+3]; // row_tmp2[i+2] = row_tmp[i+2]; // row_tmp2[i+3] = row_tmp[i]; 修改成:

	for (int i = 0; i+3 < bitmap.bmWidth * bitmap.bmHeight * 3; i+=3)
	{
		row_tmp2[i] = row_tmp[i+2];
		row_tmp2[i+1] = row_tmp[i+1];
		row_tmp2[i+2] = row_tmp[i];
	}
看看效果
无言猪 2013-04-09
  • 打赏
  • 举报
回复
for (int i = 0; i+3 < bitmap.bmWidth * bitmap.bmHeight * 3; i+=3)
{
    row_tmp2[i] = row_tmp[i+3];
    row_tmp2[i+2] = row_tmp[i+2];
    row_tmp2[i+3] = row_tmp[i];
}
为什么不是i+1,i+2...
u010225776 2013-04-09
  • 打赏
  • 举报
回复
引用 8 楼 lostying 的回复:
话说你就把BITMAPINFOHEADER的内容贴出来让斑竹看看呗,还有上下倒不是左右倒

	bytes_per_line  = ((width * 3 + 3) / 4) * 4;
	bytes_per_pixel = depth / 8;
	
	Header.Info.biSize		= sizeof(BITMAPINFOHEADER);
	Header.Info.biWidth		= width;
	Header.Info.biHeight		= height;
	Header.Info.biBitCount		= depth;
	Header.Info.biPlanes		= 1;
	Header.Info.biXPelsPerMeter	= 0;
	Header.Info.biYPelsPerMeter	= 0;
	Header.Info.biClrUsed		= 0;
	Header.Info.biClrImportant	= 0;
	Header.Info.biCompression	= depth == 24? BI_RGB: BI_BITFIELDS;  //24位要设定BI_RGB,其它16位或32位设定为BI_BITFIELDS
	Header.Info.biSizeImage		= bytes_per_line * height;
无言猪 2013-04-09
  • 打赏
  • 举报
回复
话说你就把BITMAPINFOHEADER的内容贴出来让斑竹看看呗,还有上下倒不是左右倒
u010225776 2013-04-09
  • 打赏
  • 举报
回复
引用 4 楼 sha_jinhao 的回复:
http://bbs.csdn.net/topics/340009148 BMP图像像素矩阵是从图像的左下角开始读取的。
斑竹看我上面的效果,就差每一行没反过来了,但颜色我估计还是不对!咋整啊!
u010225776 2013-04-09
  • 打赏
  • 举报
回复
引用 3 楼 lostying 的回复:
BITMAP是倒着来的,从下往上写.


我要吐了,你看我这样修改:

for (int i = 0; i+3 < bitmap.bmWidth * bitmap.bmHeight * 3; i+=3)
{
// row_tmp2[i] = row_tmp[i+3];
// row_tmp2[i+2] = row_tmp[i+2];
// row_tmp2[i+3] = row_tmp[i];
// BITMAP是倒着来的,从下往上写
row_tmp2[i] = row_tmp[bitmap.bmWidth * bitmap.bmHeight * 3];
}


之后的效果,牛掰了!
jimette 2013-04-09
  • 打赏
  • 举报
回复
有道理!!!
jimette 2013-04-09
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/340009148 BMP图像像素矩阵是从图像的左下角开始读取的。
无言猪 2013-04-09
  • 打赏
  • 举报
回复
BITMAP是倒着来的,从下往上写.
jimette 2013-04-09
  • 打赏
  • 举报
回复
bmp格式的图片好像就是上下倒置的
u010225776 2013-04-09
  • 打赏
  • 举报
回复
虽然把BITMAPINFOHEADER中的biHeight = height;修改成Info.biHeight = -height;能够解决倒转的问题,但是总感觉这不是解决方案!也不能解决rgb的问题!

19,472

社区成员

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

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