Как мне получить цвет определенного пикселя из графического поля?

#c# #picturebox

#c# #picturebox

Вопрос:

В одной из моих программ есть графическое поле, которое отлично отображает мои изображения. Отображаемое состоит из выбранного «BackColor» и нескольких заполненных прямоугольников с помощью кисти и нескольких линий с помощью пера. У меня нет импортированных изображений. Мне нужно получить значение цвета указанного пикселя в поле изображения. Я пробовал следующее:

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

Но pictureBox1.Image всегда возвращается null . Работает .Image только с импортированными изображениями? Если нет, то как я могу заставить это работать? Есть ли какие-либо альтернативы?

Ответ №1:

Да, вы можете, но должны ли вы?

Вот изменения, необходимые для вашего кода:

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

Однако, если вы действительно не хотите назначать изображение, вы можете сделать сам 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);
}
 

Комментарии:

1. первой части кода, которую вы дали, было достаточно для моих целей, но остальная часть вашего ответа также является хорошим советом. Спасибо, что нашли время ответить на мой вопрос.