2015-08-30 4 views
0

Im разрабатывает приложение для совместного использования экрана, которое постоянно запускает цикл и получает небольшие кадры из сокета. Затем следующий шаг - нарисовать их в кадре. Конечно, я использую thread, потому что я не хочу замораживать ui.Рисовать напрямую на PictureBox

Это мой код:

Bitmap frame = byteArrayToImage(buff) as Bitmap;//a praticular bitmap im getting from a socket. 
Bitmap current = (Bitmap)pictureBox1.Image; 
var graphics = Graphics.FromImage(current); 
graphics.DrawImage(frame, left, top);//left and top are two int variables of course. 
pictureBox1.Image = current; 

Но теперь им получаю сообщение об ошибке:

Object is already in use elsewhere.

в этой линии var graphics = Graphics.FromImage(current);

пытался Clone его, создать New Bitmap(current) .. до сих пор нет sucess ..

+1

Вы можете создать графический контекст из изображения, это не имеет прямой ссылки на ваш образ больше внутри рамки, это просто новая версия изображения. После этого вы должны снова установить изображение в окно с изображениями. – Icepickle

+1

Фактически вы манипулируете самим экземпляром изображения, которое также имеет «pictureBox1» (или что вы подразумеваете под «прямой ссылкой», Icepickle?). Единственная проблема заключается в том, что 'pictureBox1' просто не знает об изменениях, внесенных вами в его' Image', поэтому он не перерисовывает себя. Попробуйте называть 'pictureBox1.Refresh()' или 'pictureBox1.Invalidate()' (следуя предложению Icepickle: 'pictureBox1.Image = pictureBox1.Image;' должен работать также - решите для себя) – olydis

+1

Huh? ... Я согласен с olydis. Просто обновите свой графический ящик, и он должен обновиться! –

ответ

0

Invalidate() ваш PictureBox так перерисовывает себя:

Bitmap frame = byteArrayToImage(buff) as Bitmap; 
using (var graphics = Graphics.FromImage(pictureBox1.Image)) 
{ 
    graphics.DrawImage(frame, left, top); 
} 
pictureBox1.Invalidate(); 

Если вам это нужно, чтобы быть потокобезопасными, то:

pictureBox1.Invoke((MethodInvoker)delegate { 
    Bitmap frame = byteArrayToImage(buff) as Bitmap; 
    using (var graphics = Graphics.FromImage(pictureBox1.Image)) 
    { 
     graphics.DrawImage(frame, left, top); 
    } 
    pictureBox1.Invalidate(); 
}); 
+0

Я просто попытался сделать недействительным, но это очень ** очень медленно, и весь процесс рисования идет медленно. Пожалуйста, просмотрите мои последние строки в моем вопросе, я только что отредактировал его. теперь я назначаю новое изображение элементу управления фотокамерой, но я все равно получаю excpetion. благодаря !! – Slashy

+0

Обратите внимание, что в моем примере есть блок 'using' для правильной утилизации графики. Это должно избавиться от ошибки, которую вы видите. –

+0

смотрите сообщение снова пожалуйста. просто отредактировал его. Спасибо за все! – Slashy