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

6

我需要加载一个作为Blob保存的JPG图像。GDI+可以很容易地从文件中检索图像,但无法从数据库中检索...

2个回答

3

请查看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;
}

但是需要进行错误检查等操作(这里省略了),以使事情更加清晰明了。


这就是我没有尝试编译它的后果。 - Eclipse

0

首先将您的博客获取到一个字节数组中,然后使用类似以下代码:

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;
}

在C++中,MemoryStream的等效物是什么? - djeidot
我最初误读了标题,认为你在寻找C#。但事实上MemoryStream在C++中也是可用的:http://msdn.microsoft.com/en-us/library/system.io.memorystream(VS.71).aspx - Jason Kealey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接