PictureBox медленно обновляется в C# GUI? - PullRequest
0 голосов
/ 07 февраля 2020

Я снимаю изображения с помощью камеры машинного зрения и храню их в папке. Я хочу показать сохраненное изображение в окне PictureBox перед сохранением следующего изображения. Мой код успешно показывает изображение в pictureBox, однако есть задержка, то есть, когда изображение 10 сохраняется в папке, GUI показывает только изображение 3. Я не уверен, как повысить производительность, чтобы GUI для обновления в реальном времени при съемке изображений.

Я думаю, что моя проблема может быть связана с использованием изображения png для создания MemoryStream вместо буфера byte [] (необработанные данные датчика). Я попытался использовать байт [], но не смог успешно заполнить pictureBox.

Это мой код:

// Grab a number of images.
for (int i = 0; i < num_images; ++i)
{
// Wait for an image and then retrieve it. A timeout of 5000 ms is used.
     IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000, 
     TimeoutHandling.ThrowException);
     using (grabResult)
     {
          // Image grabbed successfully?
          if (grabResult.GrabSucceeded)
          {

               buffer = grabResult.PixelData as byte[];
               //ImageWindow.DisplayImage(0, grabResult);
               file_extension = "Position_" + i + ".png";
               image_filename = String.Concat(image_filepath, file_extension);
               ImagePersistence.Save(ImageFileFormat.Png, image_filename, grabResult);
               //image_algorithms();

               Image image = Image.FromFile(image_filename);
               var ms = new MemoryStream();
               image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
               var bytes = ms.ToArray();
               var imageMemoryStream = new MemoryStream(bytes);
               Image imgFromStream = Image.FromStream(imageMemoryStream);
               pictureBox1.Image = imgFromStream;
               pictureBox1.Refresh();

               }
               else
               {
                    Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, 
                    grabResult.ErrorDescription);
               }
         }
}
...