如何将读取到内存中的BMP图片转换为IplImage

5 篇文章 0 订阅
2 篇文章 0 订阅

如果已经将BMP图片读取到内存中(带图像头信息),要将BMP内存数据转换为IplImage进行处理的话可以使用如下函数

IplImage* GetIplFromBmp(BYTE *pBmp)
{
	BYTE *p = pBmp;
	BITMAPFILEHEADER fheader;
	memcpy(&fheader, p, sizeof(BITMAPFILEHEADER));
	BITMAPINFOHEADER bmphdr;
	p += sizeof(BITMAPFILEHEADER);
	memcpy(&bmphdr, p, sizeof(BITMAPINFOHEADER));
	int w = bmphdr.biWidth;
	int h = bmphdr.biHeight;
	p = pBmp + fheader.bfOffBits;
	
	IplImage *pIpl = cvCreateImage(cvSize(w, h), 8, 1);
	pIpl->origin = IPL_ORIGIN_BL;
	memcpy(pIpl->imageData, p, w * h * sizeof(char));
	return pIpl;
}

注,代码所处理对象为单通道灰度图像,如果要在处理三通道彩色图像需要以下两句改为
cvCreateImage(cvSize(w, h), 8, 3);
memcpy(pIpl->imageData, p, w * h * 3 * sizeof(char));

 

从IplImage对象中生成BMP的图像文件流

bool GetBmpFromIpl(IplImage* pIpl, BYTE* &pBmp) 
{	
    BITMAPFILEHEADER bfh = {0}; 
    DWORD dwImageSize = 0; 
	DWORD dwBytesRead = 0; 
	
	int w = pIpl->width; 
    int l = ((w * 24 +31) & ~31) / 8; 
    int h = pIpl->height; 
    dwImageSize = l * h; 
	
    bfh.bfType = (WORD)'M' << 8 | 'B';	//定义文件类
	bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);	//定义文件头大小
	
	bfh.bfSize = bfh.bfOffBits + dwImageSize;	//文件大小
	
	BITMAPINFOHEADER bih = {0}; 
	bih.biSize = sizeof(BITMAPINFOHEADER);
	bih.biWidth = pIpl->width;
	bih.biHeight = pIpl->height;
	bih.biPlanes = 1;
	bih.biBitCount = 24; 
	bih.biCompression = BI_RGB;
	bih.biSizeImage = 0; 
	bih.biXPelsPerMeter = 0; 
	bih.biYPelsPerMeter = 0;
	bih.biClrUsed = 0; 
	bih.biClrImportant = 0;      
	size = bfh.bfSize; 
	pBmp = new BYTE[bfh.bfSize+1];      
	memset(pBmp, 0, bfh.bfSize + 1); 
	memcpy(pBmp, &bfh, sizeof(BITMAPFILEHEADER));
	memcpy(pBmp+sizeof(BITMAPFILEHEADER), &bih, sizeof(BITMAPINFOHEADER)); 
	BYTE* p = pBmp+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	memcpy(p, (BYTE*)pIpl->imageData, dwImageSize);  
    return true;
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值