2013-09-03 3 views
3

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

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

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

Есть ли способ исправить это/работать вокруг?

wrong alpha value

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

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

+0

Возможно [эта информация] (http://stackoverflow.com/a/2439466/62576) может помочь. –

+0

Фактически, я использую решение в первом ответе (ответ Райана). К сожалению, я не могу использовать внешние библиотеки (ограничение на развертывание), как и другие ответы (хотя я бы получил лучшие результаты с ними). Третий ответ заключался только в том, чтобы растянуть изображения, но мы все знаем, какие проблемы растягиваются. Библиотека Graphics32, похоже, не работает с Delphi 5 (использует функции от D6). – beerwin

ответ

1

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

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

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

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

Смежные вопросы