簡體   English   中英

如何從圖片框中獲取特定像素的顏色?

[英]How do I get the color of a specific pixel from a picture box?

我的一個程序中有一個圖片框,可以很好地顯示我的圖像。 顯示的內容包括選定的“背景色”和一些使用畫筆填充的矩形和一些使用鋼筆填充的線條。 我沒有導入的圖像。 我需要檢索圖片框上指定像素的顏色值。 我嘗試了以下方法:

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

但是pictureBox1.Image總是返回null .Image僅適用於導入的圖像嗎? 如果不是,我怎樣才能讓它發揮作用? 有沒有其他選擇?

是的,你可以,但你應該嗎?

這是您的代碼需要的更改:

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

簡單地繪制它的背景是不一樣的。 這是獲得分配的真實位圖的最小代碼:

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

但是,如果您真的不想分配 Image ,則可以讓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 += "ARGB :" + 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM