Png поверх jpeg (эффект водяного знака) плохого качества?

#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.

Оригинальный Pgn

Это оригинальный jpg.

Оригинальный 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, мне было интересно, заметит ли кто-нибудь мой новый аватар. Я изменил его прошлой ночью.