Как загрузить и сохранить изображение из базы данных SQL Server с помощью GDI + и C ++?

Мне нужно специально загрузить изображение JPG, которое было сохранено как blob. GDI + позволяет очень легко получать изображения из файлов, но не из баз данных ...


person djeidot    schedule 10.10.2008    source источник


Ответы (2)


Взгляните на Image :: Image (IStream *, BOOL ). Это принимает указатель на COM-объект, реализующий интерфейс IStream. Вы можете получить один из них, выделив некоторую глобальную память с помощью 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;
}

Но с проверкой ошибок и т. Д. (Здесь опущено, чтобы было понятнее)

person Eclipse    schedule 10.10.2008
comment
Это то, что я получил за то, что не пытался его скомпилировать. - person Eclipse; 11.10.2008

Сначала загрузите свой блог в массив байтов, а затем используйте что-то вроде этого:

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;
}
person Jason Kealey    schedule 10.10.2008
comment
что эквивалент MemoryStream на C ++? - person djeidot; 10.10.2008
comment
Изначально я неправильно прочитал название и подумал, что вы ищете C #. Похоже, MemoryStream также доступен на C ++: msdn.microsoft.com/en-us/library/ - person Jason Kealey; 10.10.2008