Сделайте перекрывающийся picturebox прозрачным в C # .net - PullRequest
5 голосов
/ 07 января 2011

У меня есть два перекрывающихся графических блока. Изображения обоих графических блоков имеют несколько прозрачных пикселей. Я хочу видеть нижнюю рамку через прозрачные пиксели перекрывающегося блока.

Я попытался установить цвет фона обоих графических блоков как прозрачный. Но он просто устанавливает задний цвет графического блока на цвет фона формы.

Ответы [ 3 ]

5 голосов
/ 07 января 2011

Очевидно, что вы используете Winforms. Да, прозрачность моделируется рисованием пикселей родительского элемента. Что это за форма, вы видите только пиксели формы, эффекты суммирования не работают. Есть статья KB , которая показывает обходной путь для этого. Это больно. Другой подход состоит в том, чтобы не использовать элементы управления PictureBox, а просто рисовать изображения в событии Paint формы.

Рассмотрим WPF, у него совсем другая модель рендеринга, которая легко поддерживает прозрачность.

4 голосов
/ 26 октября 2011

Если это один PictureBox внутри другого, вы можете использовать:

<code>innerPictureBox.SendToBack(); innerPictureBox.Parent = outerPictureBox;

4 голосов
/ 07 января 2011

Решения этой проблемы могут быть различными, и это в основном зависит от ваших навыков, а объем работы будет зависеть от типа изображений, с которыми вы имеете дело. Например, если изображения всегда имеют одинаковое разрешение, размер и перекрывающиеся изображения поддерживают прозрачность, вы можете попробовать манипулировать двумя Image объектами и рисовать один над другим, а затем отобразить его в PictureBox. Или, если вам нужно будет сделать это несколько раз в разных местах вашего приложения, вы можете даже подумать о создании собственного UserContriol.

Код в ответе на этот вопрос , метод ResizeImage, в частности, покажет, как создать изменяемое изображение хорошего качества, все, что вам нужно, это немного изменить его. Сделайте так, чтобы получить два Images в качестве входных параметров, и измените его так, чтобы рисовать одно изображение поверх другого.

Изменения могут выглядеть следующим образом

    public static Bitmap CombineAndResizeTwoImages(Image image1, Image image2, int width, int height)
    {
        //a holder for the result
        Bitmap result = new Bitmap(width, height);

        //use a graphics object to draw the resized image into the bitmap
        using (Graphics graphics = Graphics.FromImage(result))
        {
            //set the resize quality modes to high quality
            graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //draw the images into the target bitmap
            graphics.DrawImage(image1, 0, 0, result.Width, result.Height);
            graphics.DrawImage(image2, 0, 0, result.Width, result.Height);
        }

        //return the resulting bitmap
        return result;
    }

И используйте его, например, так:

  pictureBox1.Image = CombineAndResizeTwoImages(Image.FromFile("c:\\a.png"), Image.FromFile("c:\\b.png"), 100,100);

Но это единственный пример, и вы должны настроить его под свои нужды. Удачи.

...