将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中:
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);
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);
相关文章推荐
- 使用LibJpg保存JPG图像或数据
- 数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)
- matlab imwrite函数保存jpg格式图像丢失数据或改变图像
- VC保存和显示数据库图像(JPG、JPEG)
- matlab批处理多个文件数据及保存多个输出图像的方法及例子
- python中对numpy数组的保存(图像分析image2array后保存数组可用于进一步数据分析)
- C++保存图像数据至BMP文件
- CImage读取8位灰度图像数据
- VC保存和显示数据库图像(JPG、JPEG)
- 为raw数据添加图像头,并保存为bmp图像
- 把从framebuffer抓出来的数据转换成jpg图像
- 使用 Video4Linux 采集USB摄像头的图像,并保存到一张 jpg图像文件中的程序
- 如何将jpg格式图像文件转化成一系列二进制数据,又如何将此二进制数据转化成jpg格式的文件?
- 将rgb图像数据保存为BMP格式图片的方法
- MFC获取rgb图像数据后动态显示及保存图片的方法
- openwrt mjpg-streamer 保存图像及错误解决
- VB直接保存和显示ACCESS数据库中的图像数据
- C++ DirectShow读取摄像头后然后保存图像数据
- 为raw数据添加图像头,并保存为bmp图像(改进)