Изменение размера изображения png в Delphi - неверный альфа-канал

Я изменяю размер изображений png, которые могут иметь альфа-канал.

Все работает хорошо, за одним исключением: вокруг прозрачных областей появляются серые пиксели.

Исходное изображение не имеет теней.

Есть ли способ это исправить/обойти?

неверное альфа-значение

Я использую SmoothResize Густаво Дауда (см. первый ответ на этот вопрос), чтобы изменить размер png-изображения.

Я не могу предоставить код, который я использую, так как я его не писал и не имею разрешения автора на его публикацию.


person beerwin    schedule 03.09.2013    source источник
comment
Возможно, эта информация может помочь.   -  person Ken White    schedule 04.09.2013
comment
Фактически, я использую решение в первом ответе (ответ Райана). К сожалению, я не могу использовать внешние библиотеки (ограничение развертывания), как предлагали другие ответы (хотя с ними я получил бы лучшие результаты). В третьем ответе предлагалось только растянуть изображения, но мы все знаем, какие проблемы возникают при растяжении. Библиотека Graphics32, похоже, не работает с Delphi 5 (использует функции из D6).   -  person beerwin    schedule 04.09.2013


Ответы (1)


Я подозреваю, что это вызвано двумя вещами: забавными значениями RGBA в PNG и наивным кодом изменения размера.

Вам необходимо проверить содержимое PNG. Вы ищете значения RGB в прозрачных областях. Несмотря на то, что прозрачные области имеют альфа-значение 0, они по-прежнему содержат информацию RGB. В вашем случае я ожидаю, что прозрачные области будут заполнены черным значением RGB. Это то, что может вызвать серый контур после изменения размера, если изменение размера сделано наивно. Пример. Что произойдет, если код изменит размер двух корректирующих пикселей (0,0,0,0) и (255,255,255,255) в один? Оба пикселя вносят вклад в 50%. Результат равен 128 128 128 128 (полупрозрачный серый цвет). То же самое происходит, когда вы увеличиваете масштаб, например, на x1,5, добавленный пиксель между исходными двумя будет серым. Обычно этого не происходит, потому что программное обеспечение для редактирования изображений достаточно умно, чтобы заполнить эти невидимые пиксели цветом из ближайшего видимого пикселя.

Вы можете попытаться «исправить» PNG, заполнив прозрачные области белым цветом (или другим цветом, который находится на границе ваших изображений).

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

person Kromster    schedule 15.09.2013