我从一个MP3文件中解析到一个 BITMAP 文件, 把它放在内存里面。现在要把它显示到界面上去。在MSDN上找来找去,都只找到从文件和resource里加载图片到BTIMAP结构的函数。所以我想把这段内存做成resource。再用这些函数显示出来。不知道有没有方法?

解决方案 »

  1.   

    用CImage类可以直接读入文件
    HRESULT Load(
       LPCTSTR pszFileName 
    ) throw( );还可以实现另存等很多功能,详见http://msdn.microsoft.com/zh-cn/library/5eb252d0.aspx
      

  2.   

    cimage 大多用的loadfromfile,loadfromresource这些win api。
    没有我想要的。
      

  3.   

    我搜了一通也没有找到如何把内存中的一段内存段(实际是图片的缓冲区)直接显示出来,但是我有一个变通的办法,你可以把这一段图像的内容存储成一个文件(具体这一段的内容是什么能读出来,新建一个文件,往里面写数据,把这一段的内容都写进去),再用LoadImage函数把该文件载入到程序中,并显示出来就可以了。具体函数用法可以查MSDN。
      

  4.   

    我有VC6.0下的精简版本的MSDN,你输入Image搜一下里面有个FromStream然后看看他的示例代码,我看了一下应该可以实现直接从内存中显示图像。
      

  5.   

    又搜到一个方法,你可以试下:SetDIBitsToDevice(m_hMemDC,
      0,   // xDest
      0,   // yDest
      m_nWidth,
      m_nHeight,
      0,   // xSrc
      0,   // ySrc
      0,   // uStartScan  开始复制的扫描线和要复制的扫描线数
      m_nHeight,  // cScanLines
      pBits,   // lpvBits 指向DIB中的象素数据部分
      pInfoHeader,  // lpbmi 指向BITMAPINFO结构
      DIB_RGB_COLORS); // fuColorUse 指定了DIB中数据的类型
    参数说的很详细了吧,第一个参数就是你屏幕DC如果你想使用双缓冲,那么m_hMemDC可以是与显示器兼容的内存DC再用bibit,把内存DC copy到屏幕DC上.
      

  6.   

    多谢楼上的仁兄。
    我自己找到的解决的方法。
    下面二个个资源很了我很大的帮助。 http://stackoverflow.com/questions/3514275/load-image-from-memory-buffer-using-atl-cimage
    You could do it with the CImage::Load(IStream*) function. You can get the IStream from CreateStreamOnHGlobal() or create your own.Beware that using the file is actually the superior solution. CImage creates a memory-mapped file to demand-load the pixels from the image. When you load from memory you need double the memory and you'll put pressure on the paging file. And you'll run into trouble if the image is large.http://www.4ucode.com/Study/Topic/1170367
     // load resource into mem
    ory
     DWORD len = SizeofResource(hInst, hRsrc);
     BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
     if (!lpRsrc)
      return FALSE;
     // Allocate global memory on which to create stream
     HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
     BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
     memcpy(pmem,lpRsrc,len);
     IStream* pstm;
     CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream
     m_Image.Load(pstm);