15,978
社区成员
发帖
与我相关
我的任务
分享
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 ;
}