ImageSharp: прозрачность закругления углов угасает, а не свет
Я использую библиотеку ImageSharp (доступную в NuGet как 1.0.0-бета0001) для генерации изображений и манипулирования ими в.NET Core 2.0, и столкнулся с чем-то, что я не могу найти способ обойти.
Используя этот пример в качестве основы, я пытаюсь скруглить углы белого изображения. Я обнаружил, что прозрачный IPath
вырубленные углы заканчиваются темным сглаживанием, как если бы прозрачный "цвет" был черным или серым (тогда как на самом деле он вообще не должен рассматриваться как какой-либо цвет).
Вот верхний правый сектор изображения, чтобы продемонстрировать, что я имею в виду:
Я перепробовал все варианты PixelBlenderMode
в этой части кода и никто не произвел то, что я после:
img.Mutate(x => x.Fill(Rgba32.Transparent, corners, new GraphicsOptions(true)
{
BlenderMode = PixelBlenderMode.Src // enforces that any part of this shape that has color is punched out of the background
}));
1 ответ
Проблема, которую вы видите, является следствием неправильной выборки пикселей. Пиксели с низкой прозрачностью слишком сильно влияли на среднее значение отдельных компонентов.
Цитируя часть текста, приведенного ниже, приведите ссылку в качестве примера, поскольку она хорошо объясняет проблемы.
Пиксель в белой области имеет цвет RGBA(1,00, 1,00, 1,00, 1,00). Пиксель в красной области имеет цвет RGBA(1,00, 0,00, 0,00, 0,10). Если вы усредните эти числа вместе, вы получите (1,00, 0,50, 0,50, 0,55). Это цвет, который будет иметь типичный пиксель на границе, если вы измените размер изображения простым способом. Но этот цвет - полупрозрачный светло-красный - не тот цвет! Вы можете увидеть слабый красный ореол вокруг границы, которого не должно быть:
http://entropymine.com/imageworsener/resizealpha/
Исправление простое, значения должны быть предварительно умножены их альфа-компонентом перед выборкой.
Однако я не знаю, возникает ли эта проблема из-за изменения размера сгенерированного изображения (исправлено в последних ночных вечерах) или во время процесса заполнения. Мне нужно сначала посмотреть пример кода, чтобы быть уверенным, поскольку я не знаю, как вы предоставляете исходное изображение.