Прозрачность графики на PictureBox - PullRequest
0 голосов
/ 13 января 2010

Прежде всего, речь идет не о прозрачности элемента управления PictureBox. Речь идет о растровой прозрачности на полностью непрозрачном «холсте».

PictureBox всегда будет иметь размер 300 * 300 с белым фоном. Для контроля не требуется прозрачность.

Мне нужен способ нарисовать прозрачный прямоугольник (или что-то еще) на pictureBox, чтобы все, что там было, будет видно «через» прямоугольник.

Скажите, у меня есть следующий код

Bitmap bmp = new Bitmap(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100);
pictureBox.Image = bmp;

Это нарисует красный прямоугольник в середине белого холста. Теперь мне нужен еще один (прозрачный) «слой» на картинке, содержащий еще один прямоугольник, но прозрачный.

Я могу попробовать

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0));
g.FillRectangle(brush, 50, 50, 200, 200);

Поскольку я использую цвет, указав его альфа = 128, результирующий прямоугольник должен быть прозрачным, поэтому первый красный прямоугольник должен быть виден через этот другой зеленый.

Однако это не происходит правильно. Я вижу красный прямоугольник за новым зеленым, но часть зеленого прямоугольника, которая не перекрывает красный, останется полностью непрозрачной. Однако, если я установлю альфа-значение цвета на какое-то чрезвычайно малое значение (скажем, 1-5), весь прямоугольник будет выглядеть прозрачным. На мой взгляд, это ненормально - 5/255 только наполовину прозрачно, а 128/255 вообще не прозрачно ... И если ранее была нарисована строка с помощью g.DrawString (), строка либо отображается позади зеленый прямоугольник или нет, в зависимости от уровня прозрачности. Например, если альфа больше или равна (около) 40, строка вообще не видна, а если она меньше 40, то она покажет, более видимую для меньших значений альфа, вплоть до альфа = 0.

Как применяется эта кисть (если она создана из цвета Argb)? Я что-то пропустил? Мне кажется, что установка прозрачной кисти делает фон «более видимым» вместо настройки объекта «менее видимым».

Спасибо за любые ответы с предложениями.

[EDIT] Кажется, у меня была неприятная ошибка в логике приложения, поэтому процедура рисования происходила в цикле, поэтому, когда я накапливал определенное количество прозрачных прямоугольников, они становились все более и более толстыми.

Код, выведенный из цикла, работает правильно.

Мой плохой.

1 Ответ

0 голосов
/ 13 января 2010

альтернативный текст http://lh4.ggpht.com/_1TPOP7DzY1E/S02ivAoGgTI/AAAAAAAAC6s/ZQvZQ5GdwSU/s800/Capture4.png

делается с помощью этого кода:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bmp = new Bitmap(300, 300);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
        g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200);
        g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100);
        g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
            Brushes.Black, new Point(150, 150));
        pictureBox1.Image = bmp;

        Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0));
        g.DrawRectangle(Pens.Black, 50, 50, 200, 200);
        g.FillRectangle(brush, 50, 50, 200, 200);
    }

Зеленая часть непрозрачна, как вы можете видеть ... Строка отлично видна.

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

фон "более видимый" и объект "менее видимый" - это одно и то же ...

...