Я работаю над проектом, и мне нужно нарисовать блоки изображений (в виде растровых изображений), которые я получаю из сокета на уже существующее изображение (которое я определяю в начале программы), и отобразить его на PictureBox
- другими словами, обновлять изображение каждый раз, когда я получаю новый блок.C# Рисование растрового изображения над другим
Чтобы сделать это асинхронно, я использую Thread
, который считывает данные с Socket
и обрабатывает его.
Это мой код:
private void MainScreenThread() {
ReadData();
initial = bufferToJpeg(); //full screen first shot.
pictureBox1.Image = initial;
while (true) {
int pos = ReadData();
int x = BlockX();
int y = BlockY();
Bitmap block = bufferToJpeg(); //retrieveing the new block.
Graphics g = Graphics.FromImage(initial);
g.DrawImage(block, x, y); //drawing the new block over the inital image.
this.Invoke(new Action(() => pictureBox1.Refresh())); //refreshing the picturebox-will update the intial;
}
}
private Bitmap bufferToJpeg()
{
return (Bitmap)Image.FromStream(ms);
}
Я получаю сообщение об ошибке
объект используется в настоящее время в других местах
На линии Graphics
создания
Graphics g = Graphics.FromImage(initial);
Я не использую какие-либо другие темы или не имею доступа к растровому изображению. Так что я не уверен, в чем проблема здесь.
Если кто-нибудь может просветить меня, я буду очень благодарен.
Спасибо.
Вы только что обнаружили, что ни PictureBox, ни класс Bitmap потокобезопасны. К счастью, в классе битмапа есть встроенная для этого диагностика, kaboom, когда вы используете Graphics.FromImage() в то же самое время, когда PictureBox реплицирует себя. Довольно случайные, как и ошибки с чередованием. Вам нужно вызвать больше кода, а также Graphics.FromImage и DrawImage. Или создайте свой собственный потокобезопасный класс PictureBox, его переопределению OnPaint() необходимо выполнить блокировку, которую вы также используете в этом методе. –
Скорее всего, вы быстро столкнетесь с «OutOfMemoryException» с этим, вам нужно избавиться от «блока» в каждом цикле и избавиться от 'g', когда вы закончите. –