C # - от родного HBitmap до потока в кодировке JPEG, прозрачности и перевернутого - PullRequest
1 голос
/ 27 февраля 2011

Моя последняя цель - поместить HBitmap, который я извлек из кэша миниатюр Windows, используя этот код:

// GUID of IShellItem.
Guid uuid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
SHCreateItemFromParsingName(filename, IntPtr.Zero, uuid, out ppsi);
((IShellItemImageFactory)ppsi).GetImage(new SIZE(72, 72), 0, out hbitmap);

в поток в кодировке JPEG, который я затем отправлю по сети.

Моя первая попытка была использовать Image.FromHBitmap(), но эта игнорирует альфа-канал.Смотрите этот вопрос: Используйте собственный HBitmap в C #, сохраняя альфа-канал / прозрачность

Очевидно, что решение состоит в том, чтобы создать новое растровое изображение, которое использует данные нативного растрового изображения.Но, пожалуйста, проверьте комментарии ответа Ганса на другой вопрос: одни пальцы будут перевернуты, а другие нет.Есть ли возможность определить, должен ли я вращаться или нет?(нет ответа на комментарий Дэвида, и я не могу комментировать там ...) Я читал много раз, что обычно растровые данные хранятся в обратном порядке, и тогда значение шага будет отрицательным.Я проверил все поля объекта NativeMethods.BITMAP, и все они не отличаются для обычных и перевернутых изображений.Поэтому должно быть другое решение.

Существует также другая проблема: при сохранении растрового изображения в JPEG-поток с .Save(somestream, ImageFormat.Jpeg) фон, сияющий через прозрачные части изображения, становится белым, но я хочу, чтобыбыть черным.

Заранее спасибо!

...