代码之家  ›  专栏  ›  技术社区  ›  djeidot

如何使用GDI+和C++从SQL Server数据库加载和保存图像?

  •  6
  • djeidot  · 技术社区  · 17 年前

    我特别需要加载一个保存为blob的JPG图像。GDI+使从文件中检索图像变得非常容易,但无法从数据库中检索图像。..

    2 回复  |  直到 17 年前
        1
  •  2
  •   Salman A    17 年前

    看一看 Image::Image(IStream *, BOOL) 。这需要一个指向实现IStream接口的COM对象的指针。您可以通过分配一些全局内存来获得其中之一 GlobalAlloc 然后打电话 CreateStreamOnHGlobal 在返回的手柄上。它看起来像这样:

    shared_ptr<Image> CreateImage(BYTE *blob, size_t blobSize)
    {
        HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE,blobSize);
        BYTE *pImage = (BYTE*)::GlobalLock(hMem);
    
        for (size_t iBlob = 0; iBlob < blobSize; ++iBlob)
            pImage[iBlob] = blob[iBlob];
    
        ::GlobalUnlock(hMem);
    
        CComPtr<IStream> spStream;
        HRESULT hr = ::CreateStreamOnHGlobal(hMem,TRUE,&spStream);
    
        shared_ptr<Image> image = new Image(spStream);  
        return image;
    }
    

    但有错误检查等(为了更清楚起见,这里省略了)

        2
  •  0
  •   Jason Kealey    17 年前

    首先将你的博客提取到一个字节数组中,然后使用这样的东西:

    public static Image CreateImage(byte[] pict)
    {
       System.Drawing.Image img = null;
       using (System.IO.MemoryStream stream = new System.IO.MemoryStream(pict)) {
        img = System.Drawing.Image.FromStream(stream);
       }
       return img;
    }