Как я могу загрузить изображение из ресурса, используя GDI +? - PullRequest
3 голосов
/ 27 апреля 2009

Я пытаюсь загрузить не-bmp изображение (в моем случае png) в экземпляр Bitmap / Image из ресурса в моем приложении. Поскольку у конструктора растровых изображений есть перегрузка только для растрового ресурса, вот что я нашел:

Я выделяю память в глобальной куче, а затем копирую в нее данные ресурса. Затем я создаю IStream для этого блока глобальной памяти (используя CreateStreamOnHGlobal) и использую конструктор Image / Bitmap, который принимает этот поток. В основном это работает, хотя я не уверен, что это лучший способ сделать это: Я заметил, что если я освобожу этот блок памяти после создания изображения, он не будет прорисован (вызов DrawImage ничего не даст). Что поднимает два вопроса:

  1. Как мне управлять временем жизни этого блока памяти? Я сомневаюсь, что это будет освобождено после уничтожения изображения.

  2. Использует ли класс Image / Bitmap данные png в сжатом виде и переводит их в необработанные данные при каждом вызове DrawImage? Кажется очень неэффективным.

Любые предложения?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2009

При использовании не растровых ресурсов мой код основан на этом из codeproject .

IStream* pStream = NULL;
::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream)
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();

Глядя на этот код, когда вы выполняете поток from для создания растрового изображения, вы вызываете Release() в потоке, чтобы удалить счетчик ссылок в потоке, тем самым связывая время жизни потока с растровым изображением.

Тогда вы можете использовать любой механизм, которым хотите управлять этим указателем.

0 голосов
/ 27 апреля 2009

Преобразовать растровое изображение в CachedBitmap , а затем избавиться от памяти.

...