如何从图片框中获取特定像素的颜色?

时间:2014-06-22 18:28:01

标签: c# picturebox

我的一个程序中有一个图片框,可以很好地显示我的图像。显示的内容包括所选的" BackColor"和一些填充的矩形使用画笔和一些线使用笔。我没有导入的图像。我需要检索图片框上指定像素的颜色值。我尝试过以下方法:

Bitmap b = new Bitmap(pictureBox1.Image);          
                Color colour = b.GetPixel(X,Y)

pictureBox1.Image始终返回null.Image仅适用于导入的图像吗?如果不是,我怎么能让它工作?还有其他选择吗?

1 个答案:

答案 0 :(得分:3)

是的,您可以,但应该您?

以下是您的代码所需的更改:

Bitmap b = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.Height);
pictureBox1.DrawToBitmap(b, pictureBox1.ClientRectangle);
Color colour = b.GetPixel(X, Y);
b.Dispose();

但是如果你想用它做真正的工作,那么真的没有办法让PictureBox真正Image与某个地方合作,这意味着如果你想利用它的可能性,例如它的SizeMode

简单地描绘它的背景就不一样了。为此你可以(而且应该)简单地使用Panel。这是一个用于分配实际位图的最小代码:

public Form1()
{
   InitializeComponent();
   pictureBox1.Image = new Bitmap(pictureBox1.ClientSize.Width, 
                                  pictureBox1.ClientSize.Height); 
   using (Graphics graphics = Graphics.FromImage(pictureBox1.Image))
   { 
     graphics.FillRectangle(Brushes.CadetBlue, 0, 0, 99, 99);
     graphics.FillRectangle(Brushes.Beige, 66, 55, 66, 66);
     graphics.FillRectangle(Brushes.Orange, 33, 44, 55, 66);
   }  
}

但是如果您真的不想分配图片,则可以将PictureBox绘制成真实的Bitmap。请注意,必须Paint事件中绘制矩形等才能生效! (实际上你也必须出于其他原因使用Paint事件!)

现在你可以测试两种方式,例如使用标签和鼠标:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (pictureBox1.Image != null)
    {   // the 'real thing':
        Bitmap bmp = new Bitmap(pictureBox1.Image);
        Color colour = bmp.GetPixel(e.X, e.Y);
        label1.Text = colour.ToString();
        bmp.Dispose();
    }
    else
    {   // just the background:
        Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.Height);
        pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
        Color colour = bmp.GetPixel(e.X, e.Y);
        label1.Text = colour.ToString();
        bmp.Dispose();
    }

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.DarkCyan, 0, 0, 99, 99);
    e.Graphics.FillRectangle(Brushes.DarkKhaki, 66, 55, 66, 66);
    e.Graphics.FillRectangle(Brushes.Wheat, 33, 44, 55, 66);
}