Как устранить «ореол» в изображениях с прозрачным фоном - PullRequest
3 голосов
/ 22 февраля 2010

Я использую DrawImage (), чтобы рисовать некоторые изображения на форме с прозрачным фоном. Те изображения, которые являются частично прозрачными, вызывают эффект «ореола» (см. Скриншот)

Какой лучший способ предотвратить это

альтернативный текст http://www.imagechicken.com/uploads/1266798081003158300.png

EDIT

Эти же значки отлично смотрятся на моем рабочем столе, поэтому должен быть лучший способ рисования значков.

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Вероятно, это вызвано двойным рендерингом - значок отображается на вашей прозрачной форме, затем форма отображается поверх фона Везде, где ваша иконка прозрачна лишь частично, форма теряет всю прозрачность.

Возможно, вы можете внести изменения в форму для поддержки частичной прозрачности, а не двоичной.

1 голос
/ 22 февраля 2010

Является ли исходное изображение полной альфа-версией или оно имеет прозрачный цвет / однобитную альфа-маску? Обычно однобитные альфа-изображения принимают цвет фона, часто белый, и просто исчезают. Ваше изображение выглядит точно так же, как вы, если вы рисуете однобитное альфа-изображение на не белом фоне.


Если вы используете однобитовый ключ прозрачности, вы получите «ореол», или, точнее, смешивание частично прозрачных значений с цветом фона форм. Таким образом, «гало» розовый в этой форме:

public  class Form1 : Form
{
    Image newImage;

    public Form1()
    {
        this.BackColor = Color.Pink;
        this.ClientSize = new Size(168, 168);
        this.TransparencyKey = this.BackColor;

        newImage = Image.FromFile(Path.Combine(
               Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
               "dot-mac-logo.png"));
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawImage(newImage, 20, 20);
    }
}

Поэтому не используйте прозрачность в битах с полными альфа-изображениями - я не совсем уверен, как это сделать в C #, но в C вы бы использовали UpdateLayeredWindow MSDN Я сделал ранее , чтобы указать альфа-смешение между внеэкранным DC и поверхностью окна.

Пример использования UpdateLayeredWindow из C # в этом блоге MSDN .

...