如何将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
...全文
714 8 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
本课程讲了Vue3+Vue2+Uni-app(uniapp)入门基础与实战,其还重点讲解了ES6、TypeScript这些基础知识,实战由两大价值5000元的真实企业级项目组成,分别是仿京东电商网站和仿美团微信点餐小程序,同时两大项目代码全部赠送,还赠送前后端架构模板,工作直接使用。VUE和uni-app是目前热门的前端框架,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件和插件,正式上线白屏问题,性能优化、解决iphoneX“刘海”兼容性问题、微信支付、微信授权登录,获取位置在地图上显示,获取用户所在的城市和街道信息,微信小程序发布审核等。对正在工作当或打算学习VUE和uni-app高薪就业的你来说,那么这门课程便是你手的葵花宝典。学习技巧:学习当不要只看,一定要多敲代码,如果碰到某一个知识点不是很明白,不要钻牛角尖,千万不要因为一个点,放弃整个森林,接着往下学,硬着头皮开发项目。只要能亲自开发一个完整的项目,你会发现不明白的地方自然而然就明白了,项目做出来就真正的学会了。此vue和uni-app课程以面试和实战为基础进行讲解,每个知识点都会让你知道在实际项目开发如何使用,学习后,可以开发大型项目,增强逻辑思维,至少让你拥有3年以上开发经验的实力!代码和ppt均可下载!免费提供《企业级完整实战项目接口文档》,绝对可用

15,978

社区成员

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

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