Как загрузить и сохранить изображение из базы данных SQL Server, используя GDI + и C ++? - PullRequest
4 голосов
/ 10 октября 2008

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

Ответы [ 2 ]

2 голосов
/ 10 октября 2008

Взгляните на Изображение :: Изображение (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;
}

Но с проверкой ошибок и тому подобным (опущено здесь, чтобы прояснить ситуацию)

0 голосов
/ 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;
}
...