Как определить, когда изображение появляется в PictureBox - PullRequest
2 голосов
/ 22 января 2020

У меня проблема с системой. Windows .Forms.PictureBox. Я хочу показать изображение на мониторе и захватить его на камеру. Поэтому я использую Winform, который включает в себя картинку. Окно изображения:

PictureBox pb = new PictureBox();
pb.WaitOnLoad = true;

Когда я устанавливаю растровое изображение на PictureBox и записываю изображение с камеры,

// Show bmp1
this.image.Image = bmp1;
this.image.Invalidate();
this.image.Refresh();

// Delay 1s
UseTimerToDelay1s();

// Show bmp2
this.image.Image = bmp2;
this.image.Invalidate();
this.image.Refresh();

// Capture
CaptureImageFromCamera();

Это только захват bmp1.

Если Я добавляю небольшую задержку, как это,

this.image.Image = bmp2;
this.image.Invalidate();
this.image.Refresh();
UseTimerToDelay100ms();
CaptureImageFromCamera();

Это захват bmp2. Метод набора изображений выглядит как асинхронный c метод. Есть ли какой-либо метод подтверждения изображения? Спасибо.

1 Ответ

0 голосов
/ 22 января 2020

Я бы использовал первое Paint событие после назначения нового Image. Вы можете попробовать его, используя очень большой URL-адрес изображения с этого сайта .

В этом примере используется Google Lo go URL-адрес изображения. Скопируйте следующий код и убедитесь, что вы назначаете обработчики событий для событий:

bool newImageInstalled = true;
private void Form1_Load(object sender, EventArgs e)
{
    pictureBox1.WaitOnLoad = true;
}
private void PictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (!newImageInstalled)
    {
        newImageInstalled = true;
        BeginInvoke(new Action(() =>
        {
            //Capturing the new image
            using (var bm = new Bitmap(pictureBox1.ClientSize.Width, 
                pictureBox1.ClientSize.Height))
            {
                pictureBox1.DrawToBitmap(bm, pictureBox1.ClientRectangle);
                var tempFile = System.IO.Path.GetTempFileName() + ".png";
                bm.Save(tempFile, System.Drawing.Imaging.ImageFormat.Png);
                System.Diagnostics.Process.Start(tempFile);
            }
        }));
    }
}
private void button1_Click(object sender, EventArgs e)
{
    newImageInstalled = false;
    pictureBox1.ImageLocation = 
    "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
}
private void button2_Click(object sender, EventArgs e)
{
    newImageInstalled = false;
    pictureBox1.Image = null;
}
...