2010-01-13 92 views
0

首先,这不是要使PictureBox控件透明。这是关于完全不透明的“画布”上的位图透明度。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); 

由于我使用的颜色通过指定其alpha = 128,得到的矩形应该是透明的,所以第一红色矩形应该通过此其他绿色一个可见。

但是,这并不正确。我可以看到新的绿色矩形后面的红色矩形,但绿色矩形的不与红色矩形重叠的部分将保持完全不透明。但是,如果我将颜色的alpha值设置为一个非常小的值(比如1-5),整个矩形将看起来透明。这在我看来是不正常的 - 5/255只有一半透明,128/255根本不透明...如果之前使用g.DrawString()绘制了一个字符串,则该字符串显示在后面绿色矩形或不是,取决于透明度级别。例如,如果Alpha大于或等于(大约)40,则字符串根本不可见,并且如果它小于40,则它将显示,对于较小的alpha值,对于alpha = 0,更明显。

这个画笔(从Argb颜色创建时)如何应用?我错过了什么吗?对我来说,设置透明画笔似乎使背景“更明显”,而不是将对象设置为“不可见”。

感谢您的任何建议答复。

[编辑]看来我不得不在应用逻辑一个讨厌的错误,所以绘图程序发生在一个循环中,所以当我积累了一定数量透明的矩形,他们变得越来越厚。

从循环中取出的代码正常工作。

我的不好。

回答

0

alt text 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); 
    } 

绿色的部分是透明的,你可以看到...该字符串是完全可见。

对我来说,设置透明画笔似乎使背景“更明显”,而不是设置对象“不明显”。

背景“更明显”的对象“不太明显”是一样的东西......

+0

他们只对重叠部分中的同样的事情。 – 2010-01-13 10:37:30

+0

您的解决方案和我的例子都可以。看起来我有一个循环错误。用字符串示例更新了 – 2010-01-13 10:38:03

+0

。 – serhio 2010-01-13 10:41:22