#c# #silverlight #image #png #jpeg
#c# #silverlight #изображение #png #jpeg
Вопрос:
Привет, у меня есть две записываемые Bitmap, одна из jpg, а другая из png, и я использую этот метод для смешивания цветов в цикле:
private static Color Mix(Color from, Color to, float percent)
{
float amountFrom = 1.0f - percent;
return Color.FromArgb(
(byte)(from.A * amountFrom to.A * percent),
(byte)(from.R * amountFrom to.R * percent),
(byte)(from.G * amountFrom to.G * percent),
(byte)(from.B * amountFrom to.B * percent));
}
Моя проблема в альфа-канале, результат моего эффекта водяного знака плохой (качество)!
Это исходный png.
Это оригинальный jpg.
Любая помощь?
Комментарии:
1. Можете ли вы более конкретно указать «плохое качество» вашего водяного знака, которого вы хотели бы избежать?
2. Ваш png сглажен, он будет хорошо смотреться только на белом фоне. Повторное сжатие в формате jpeg было неудачным. Для этого нет простого решения, водяной знак не может использовать сглаживание.
3. Я думаю, это связано с наличием источника jpg. Сжатие с потерями в формате jpeg использует психовизуальные модели, чтобы сделать артефакты сжатия менее заметными. Наложение изображения поверх этого сжатого изображения выведет эту модель из строя. Лучший способ решить эту проблему — использовать источник сжатого изображения без потерь как для водяного знака, так и для исходного изображения.
4. @Hans: Теоретически вы можете сгладить изображение независимо от источника фона, используя переменную непрозрачность (при создании изображения). Было ли это сделано с этим изображением или нет, это отдельный вопрос. Я попробовал сохранить его и открыть в mspaint. У него черный фон, но есть белый подсветка, поэтому эта проблема может быть применима.
Ответ №1:
В этом случае вы, вероятно, не хотите, чтобы результат принимал какую-либо альфа от водяного знака, вы хотите, чтобы он сохранял 100% непрозрачности JPEG. Вместо того, чтобы устанавливать новую альфа from.A * amountFrom to.A * percent
-версию, просто используйте from.A
.
Редактировать: кроме того, вы хотите percent
, чтобы значение было скорректировано в соответствии с альфа-символом PNG. Вот ваш образец, обновленный:
private static Color Mix(Color from, Color to, float percent)
{
float amountTo = percent * to.A / 255.0;
float amountFrom = 1.0f - amountTo;
return Color.FromArgb(
from.A,
(byte)(from.R * amountFrom to.R * amountTo),
(byte)(from.G * amountFrom to.G * amountTo),
(byte)(from.B * amountFrom to.B * amountTo));
}
Я преобразовал этот код в Python и прогнал ваши образцы изображений через него с 0,5 процентами, вот результат:
Комментарии:
1. Вы сказали это раньше, чем я смог. 1 к картинке, если бы только я мог оценить ее отдельно.
2. @Ingenu, мне было интересно, заметит ли кто-нибудь мой новый аватар. Я изменил его прошлой ночью.