vc只有数据显示图片

先分配一块内存,大小为你的数组大小的三倍加上54个字节,前14个字节是位图头,查阅BITMAPFILEHEADER,接下来40个字节是信息头,查阅BITMAPINFOHEADER,然后就是你的数据了,放的格式是每三个字节放一个像素的RGB值,全彩色图不需要调色板。


LONG lSize =935*1015*3 + sizeof(BITMAPINFOHEADER )+ sizeof(BITMAPFILEHEADER) ;
m_hGraphDIB = (HDIB)::GlobalAlloc(GHND,lSize);
m_lpGraph = (LPSTR) ::GlobalLock((HGLOBAL)m_hGraphDIB);
LPBITMAPINFOHEADER lpmi = (LPBITMAPINFOHEADER)m_lpGraph;
lpmi->biSize = 40;
lpmi->biWidth =  935;
lpmi->biHeight = 1015;
lpmi->biPlanes = 1;
lpmi->biClrUsed = 0;

lpmi->biClrImportant = 0 ;
lpmi->biCompression = BI_RGB ;
lpmi->biSizeImage = 935*1015  ;
lpmi->biBitCount = 24;


然后用SetDIBitsToDevice()函数显示图像

源代码

 BITMAPFILEHEADER bmHdr;
 BITMAPINFOHEADER bmInfo;
 HANDLE hFile, hNewFile;
 DWORD dwByteWritten = 0;
 CString str;

 CBitmap bitmap;
 CDC *pDC = GetDC();

 //打开源文件句柄
 hFile = CreateFile("test.bmp",
  GENERIC_READ,
  FILE_SHARE_READ,
  NULL,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL);

 if(hFile == INVALID_HANDLE_VALUE)
  return ;
 //读取原文件bmp头和文件
 ReadFile(hFile, &bmHdr, sizeof(bmHdr), &dwByteWritten, NULL);
 ReadFile(hFile, &bmInfo, sizeof(bmInfo), &dwByteWritten, NULL);
 DWORD dwOldSize = bmInfo.biSizeImage;
 if(dwOldSize == 0)
 {
  dwOldSize = bmHdr.bfSize - sizeof(bmHdr) - sizeof(bmInfo);
 }
 unsigned char *pBuffer = NULL;
 pBuffer = new unsigned char[dwOldSize];
 if(pBuffer == NULL)
 {
  CloseHandle(hFile);
  return ;
 }
 ReadFile(hFile, pBuffer, dwOldSize, &dwByteWritten, NULL);
 //
 HDC hDC = ::GetDC(m_hWnd);
 SetDIBitsToDevice(hDC, 0, 0, bmInfo.biWidth, bmInfo.biHeight, 0, 0, 0, bmInfo.biHeight -1, pBuffer, (BITMAPINFO*)&bmInfo, DIB_RGB_COLORS);

 str.Format("%d", dwOldSize);
 AfxMessageBox(str);
 delete []pBuffer;
 CloseHandle(hFile);

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值