Почему WebImage.Resize убирает прозрачность PNG - PullRequest
6 голосов
/ 15 февраля 2011

Использование WebImage из выпуска MVC3 / WebMatrix. Загрузка следующего изображения из пути к файлу:

Sample Image - или - enter image description here

Запуск следующего кода против него:

return new WebImage(path)
       .Resize(120, 265)
       .GetBytes("Png");

В результате получается изображение с прозрачной полосой и используемым черным цветом:

Blacked out transparency

То же самое происходит с RotateRight (), RotateLeft () и FlipHorizantal () Однако, если я не вызываю метод .Resize ():

return new WebImage(path)
        .GetBytes("Png");

Изображение возвращается без проблем.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

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

Если изображение уже RGB (24-разрядное или более), это немного сложнее: что нужно сделать изменяющему размер для краев изображения, награница между «прозрачным» и «непрозрачным»?Многие алгоритмы изменения размера будут делать что-то похожее на «усреднение двух цветов» на границе (опять же, чтобы изображение выглядело более плавным), но большинство не имеют понятия прозрачности, не говоря уже о способности PNG иметь несколько уровней прозрачности.

Итак, краткий ответ «это, вероятно, ошибка» - не полная реализация функций PNG.

Решение может не существовать, но я бы попробовал:

  1. Оставайтесь в 8-битном цвете, если это возможно, или преобразуйте заранее в 32-битный.
  2. Получите цвет или индекс цвета прозрачного цвета.После изменения размера сделайте это значение прозрачным.Обратите внимание, что из-за вышеупомянутого «сглаживания» края между прозрачным и непрозрачным могут не быть этого цвета и, вероятно, будут выглядеть как смесь черного и любого другого цвета, который вам действительно нужен.
  3. Если ничего другого,вам может понадобиться использовать внешнюю библиотеку, которая дает вам больше контроля.
0 голосов
/ 15 февраля 2011

Вы пытались использовать метод Write() вместо GetBytes()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...