2014-12-01 6 views
1

Я искал создание растровых изображений PARGB32. Кажется, это необходимо для создания изображений, которые полностью работают с элементами меню после XP.Предварительно умножить пиксели после вызова WIC «Копирование пикселей»

Этот пример http://msdn.microsoft.com/en-us/library/bb757020.aspx?s=6 очень интересен, но довольно сложный, поскольку я редко использовал когда-либо ранее интерфейсы OLE. Однако, тщательно изучив фрагмент кода, который использует WIC и OLE, я думаю, что понимаю, как это работает. Единственное, что меня смущает, это комментарий пользователя «Дэвид Хеллерман». Подводя итог, он утверждает, что этот пример не завершен. Он не принимает во внимание любую потенциальную альфа-информацию в исходном значке - и если есть альфа-данные, она должна быть предварительно умножена на пиксельную основу при сканировании через переменную ppvBuffer.

Мой вопрос состоит из двух частей. Как определить наличие альфа-данных в моих значках при использовании WIC вместо GDI и как я могу сделать предварительное умножение на пиксели, если оно существует?

ответ

2

Технически код образца неверен, поскольку он не учитывает или не проверяет формат объекта IWICBitmap при вызове CopyPixels. CreateBitmapFromHICON, по-видимому, всегда использует определенный формат (этот пример предлагает 32-битную PBGRA, но комментарии указывают на то, что это BGRA) при создании растрового изображения, но это не документировано MSDN, и, опираясь на него, это, по крайней мере, плохая форма. WIC поддерживает многие пиксельные форматы, и не все из них 32-бит или RGB.

Вы можете использовать функцию WICConvertBitmapSource (http://msdn.microsoft.com/en-us/library/windows/desktop/ee719819(v=vs.85).aspx) для преобразования данных в определенном, известном формате, в вашем случае, если вы хотите GUID_WICPixelFormat32bppPBGRA (вы, вероятно, привыкли к тому, что формат записывается в виде PARGB, но WIC использует странно разумное соглашение об именах, основанное на порядке компонентов в массиве байтов, а не 32-битных ints). Если преобразование означает преумножение данных, оно сделает это, но дело в том, что если вы хотите получить определенный формат, вам не нужно беспокоиться о том, как он туда попадает. Вы можете использовать полученный IWICBitmapSource так же, как образец MSDN использует его IWICBitmap.

Вы можете использовать IWICBitmapSource :: GetPixelFormat (http://msdn.microsoft.com/en-us/library/windows/desktop/ee690181(v=vs.85).aspx), чтобы определить формат изображения. Тем не менее, нет никакого способа узнать, в целом, альфа-данные (если формат имеет альфа-данные) предварительно умножаются, вам просто нужно распознать формат GUID. Обычно я использую GetPixelFormat, когда я хочу обрабатывать более одного формата, но я все еще вернусь к WICConvertBitmapSource для форматов, которые я не обрабатываю.

Редактировать: Я пропустил часть вашего вопроса. Невозможно обнаружить на основе IWICBitmap, был ли значок первоначально иметь альфа-канал, потому что WIC создает растровое изображение с альфа-каналом из значка во всех случаях. Это также не обязательно, потому что преувеличение альфы в этом случае не является операцией.

+0

ОТЛИЧНЫЙ ответ @Vincent и тот, который действительно дает мне несколько новых идей для использования этого материала COM. Для меня это совершенно новое! Более того, я думаю, что парень на странице MSN, который сказал, что код WIC был неправильным, был на самом деле неправ! Если бы он читал дальше страницы, он видел бы функцию-инициализацию 'Initialize', используемую в рабочем примере, которая делает то же самое, что, я думаю, вы предлагаете с помощью функции' IWICConvertBitmapSource'. Я прав? –

+1

Да, похоже, они дважды написали код и сделали это правильно во второй раз (в AddIconToMenuItem), но код ближе к вершине (это все, что я видел при ответе на вопрос) ошибочен. Да, они сделали именно то, что я предлагал там. –