您的位置:首页 > 其它

将8位图像数据保存为JPG

2017-12-21 09:21 295 查看
遇到相机的图像数据需要保存成图片的问题,相机的的图像数据中是不含有文件头等信息的.此种数据保存成JPG需要先将数据在内存中存储BMP然后使用CImage转换成JPG.下面是转换过程:

CDC *pDC;
pDC=pDlg->GetDC();//取得窗体DC
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;
iWidth = pBuffer_1->GetWidth();//图像宽度为2048像素
iHeight = pBuffer_1->GetHeight();//图像的高度2048像素
MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC,iWidth/4,iHeight/4);//需要保存的图像为原来的1/4
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);//图像在MemDC中
下面是将8位图像数据放入CBitmap中:
LONG lWidth=2048;
LONG lHeight=-2048;//注意此位置为负值因为BMP图像数据存储是上下倒置
LPBITMAPINFO lpbmi;
// BMP文件头的句柄
HANDLE hBmpFileHead;
//计算信息头和调色板的大小
hBmpFileHead=::GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)
+ sizeof(RGBQUAD)
* 256);
if(hBmpFileHead==0)
{
AfxMessageBox("分配内存失败");
return;
}
//填充信息头
lpbmi=(LPBITMAPINFO)::GlobalLock((HGLOBAL)hBmpFileHead);
lpbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
lpbmi->bmiHeader.biWidth=lWidth;
lpbmi->bmiHeader.biHeight=lHeight;
lpbmi->bmiHeader.biPlanes=1;
lpbmi->bmiHeader.biBitCount=8;
lpbmi->bmiHeader.biCompression=BI_RGB;
lpbmi->bmiHeader.biSizeImage=(((lWidth*8) + 31) / 32 * 4)*lHeight;
lpbmi->bmiHeader.biXPelsPerMeter=0;
lpbmi->bmiHeader.biYPelsPerMeter=0;
lpbmi->bmiHeader.biClrUsed=256;
lpbmi->bmiHeader.biClrImportant=256;
//填充256级灰度调色板
for(int i=0;i<256;i++)
{
lpbmi->bmiColors[i].rgbBlue=i;
lpbmi->bmiColors[i].rgbGreen=i;
lpbmi->bmiColors[i].rgbRed=i;
lpbmi->bmiColors[i].rgbReserved=0;
}
SetStretchBltMode(MemDC.GetSafeHdc(),COLORONCOLOR);//避免图像缩放失真添加模式
StretchDIBits(MemDC.GetSafeHdc(),
0,0,512,512,
0,0,2047+1,2047+1,
pImageData_1,//图像数据(void *pImageData_1 = NULL;)
lpbmi,
DIB_RGB_COLORS,
SRCCOPY);//将图像数据转化成位图的主要函数
使用CImage将BMP图像保存成JPG文件:
CString st;
CString m_strLeftPath;
m_strLeftPath="D:\\Image";
st.Format("%s\\1-%08d.jpg",m_strLeftPath,pDlg->m_ulSaveNumber_1);//m_strLeftPath存储路径,pDlg->m_ulSaveNumber_1保存的图片号
CImage imgTemp; // CImage是MFC中的类。
imgTemp.Attach(MemBitmap.operator HBITMAP());
imgTemp.Save(st);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息