如何将RAW格式图片显示在MFC控件中

闭着眼刷牙 2014-05-22 01:04:01
方法一:
首先创建一个内存DC,CreateCompatibleDC(NULL)。
调用ChangeDisplaySetting设置该内存DC的显示设置【例如一个像素需要多少个bit,需要调用EnumDisplaySetting来获得恰当的显示设置。】
然后把8位位图选入该内存DC。
调用SetDIBColorTable来设置该内存DC的颜色表【把8级灰度映射到24位真彩色】。
调用BitBlt把内存DC的图像传输到窗口DC。
做一些资源清除工作。

这是我在网上找到的思路,可是完全不知道怎么写。求大神指点一个demo
...全文
816 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-06-26
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
闭着眼刷牙 2014-05-26
  • 打赏
  • 举报
回复
引用 5 楼 gordon3000 的回复:
RAW格式找到它的宽高,填写一个BITMAPINFOHEADE,直接用SetDIBitsToDevice就可以了。不用那么费劲。 如果是单字节单色想做伪彩色给他建一个调色板。
您好我这个是我写的关于上面思路的代码不知道怎么不显示请您指正一下。首先读取RAW(521*512*2 一个像素用两个字节表示)格式文件。然后创建BITMAPFILEHEADER 最后SetDIBitsToDevice输出图像
int CShowImageDlg::RawToBitmap()
{
	FILE *fp; //用于打开raw图片
	int imageW = 512;
	int imageH = 512;
	int storeW = imageW;
	BITMAPFILEHEADER bh;
	BITMAPINFOHEADER bInfo;//位图信息头
	BITMAPINFO bitmapinfo;
	
	int i = 0;
	RGBQUAD rgb;
   
	fp = fopen("d:\\image_20140313_0.raw","rb");
	if(fp == NULL)
	{
		printf("d:\\image_20140313_0.raw failed\n");
		return 0;
	}

	if(storeW%4!=0) 
	{
		storeW += (4 - (storeW % 4));//
	}

	// BITMAPFILEHEADER bh;//位图头文件(包含有关文件类型,大小,存放位置等信息)
	bh.bfType = ((WORD)('M'<<8)|'B');//"BM"说明文件类型
	bh.bfReserved1 = 0;//保留
	bh.bfReserved2 = 0;//保留
	bh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 65536 + storeW * imageH;//文件大小
	bh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 65536;

	//表示从头文件开始到实际图像数据数据之间的字节的偏移量。bfOffBits可以直接定位像素数据
	//BITMAPINFOHEADER bInfo;//位图信息头
	bInfo.biSize  = sizeof(BITMAPINFOHEADER);//说明BITMAPINFOHEADER结构所需的字数
	bInfo.biWidth = imageW;//图像宽度,以像素为单位
	bInfo.biHeight = imageH;//图像高度,以像素为单位
	bInfo.biPlanes = 1;//为目标设备说明位面数,其中总是被设为1
	bInfo.biBitCount =  16;//说明比特数/像素的颜色深度,值为0,1,4,8,16,24或32,256灰度级的颜色深度为8,因为2^8=256
	bInfo.biCompression = BI_RGB;//说明图像数据压缩类型 BI_BITFIELDS无压缩 BI_RGB没有调色板
	bInfo.biSizeImage = storeW * imageH *2;//说明图像的大小,一字节为单位,
	bInfo.biXPelsPerMeter = 0;//水平分辨率,可以设为0
	bInfo.biYPelsPerMeter = 0;//垂直分辨率,可以设为0
	bInfo.biClrUsed = 65536;//说明位图实际使用的彩色表中颜色索引数
	bInfo.biClrImportant = 0;//说明对图像显示有重要影响的颜色索引数目,为0表示都重要。

	// RGBQUAD rgb;
	rgb.rgbReserved = 0;
	for(i=0;i<65536;i++)
	{
		rgb.rgbBlue=rgb.rgbRed=rgb.rgbGreen=i;
	}
	
	memcpy(&bitmapinfo.bmiHeader, &bInfo, sizeof(bInfo));
	memcpy(&bitmapinfo.bmiColors, &rgb, sizeof(rgb));


	CRect rcDIB;
	CRect rcDC;
	rcDIB = CRect(0, 0, 512, 512);
	rcDIB.OffsetRect(0, 0);	

	CDC* pDC = this->GetDlgItem(IDC_PICTURE)->GetDC();
	HDC hDispHdc = pDC->GetSafeHdc();
	pDC->GetWindow()->GetClientRect(rcDC);

	/*创建内存DC*/
    CDC dcMemory;
    dcMemory.CreateCompatibleDC(pDC);
    dcMemory.SetBkColor(pDC->GetBkColor());
     
    CBitmap bmpMemory;
    dcMemory.SelectObject(&bmpMemory);

	/*SetDIBitsToDevice(HDC hdc, 
		              int xDest, 
					  int Ydest, 
					  DWORD dwWidth, 
					  DWORD dwHeight, 
					  intXSrc, 
					  int Ysrc, 
					  UINT uStartScan, 
					  UINT cScanLines, 
					  CONST VOID *lpvBits, 
					  CONST BITMAPINFO *lpbmi, 
					  UINT fuColorUse);*/
     SetDIBitsToDevice(hDispHdc,
	                   0,
					   0,
					   512,
					   512,
					   512,
					   512,
					   512,
					   512,
					   fp,
					   &bitmapinfo,
					   DIB_RGB_COLORS);

    /*释放资源*/
    bmpMemory.DeleteObject();
    dcMemory.DeleteDC();
	return 0 ;
}
闭着眼刷牙 2014-05-24
  • 打赏
  • 举报
回复
引用 5 楼 gordon3000 的回复:
RAW格式找到它的宽高,填写一个BITMAPINFOHEADE,直接用SetDIBitsToDevice就可以了。不用那么费劲。 如果是单字节单色想做伪彩色给他建一个调色板。
谢谢 由于初学能提供一个demo参考一下吗 万分感激
副组长 2014-05-22
  • 打赏
  • 举报
回复
RAW格式找到它的宽高,填写一个BITMAPINFOHEADE,直接用SetDIBitsToDevice就可以了。不用那么费劲。 如果是单字节单色想做伪彩色给他建一个调色板。
闭着眼刷牙 2014-05-22
  • 打赏
  • 举报
回复
引用 2 楼 sunnyloves 的回复:
没有raw处理的库吗
有现成的库吗?
叶恭介叶恭介 2014-05-22
  • 打赏
  • 举报
回复
去下佳能的SDK包,好像有显示图片的.
洗洗睡去 2014-05-22
  • 打赏
  • 举报
回复
没有raw处理的库吗
闭着眼刷牙 2014-05-22
  • 打赏
  • 举报
回复

15,980

社区成员

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

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