(eine Frage, jippie ;-)
Ich will das Bild einer Kamera live anzeigen. Die Daten kommen wie
gewöhnlich als unsigned char an. Bisheriger Ansatz: Thread, der die Daten holt:
public void DoWork()
{
while (myDevice != null && !_shouldStop)
{
Thread.Sleep(50);
myDevice.TransferLiveImage();
if (myFrmreadyDlg != null)
{
myFrmreadyDlg();
}
}
}
Danach werden die Daten in ein Bitmap gemalt und in einer Picturebox
dargestellt:
public void ShowLiveimgThreadSafe()
{
try
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.pictureBox.InvokeRequired)
{
ShowLiveimgCb cb = new ShowLiveimgCb(ShowLiveimgThreadSafe);
this.BeginInvoke(cb);
}
else
{
_device.DrawLiveImage((Bitmap)this.pictureBox.Image);
this.pictureBox.Invalidate();
}
}
catch (ObjectDisposedException)
{
}
}
myFrmreadyDlg zeigt auf ShowLiveimgThreadSafe.
Finde ich unschön: erstens das Sleep om Thread. Wenn das
weg ist, blockiert die GUI, weil zuoft neu gezeichnet werden soll.
Außerdem zeichne ich direkt in das Bitmap der Picturebox. Ich hatte eine
zeitlang Probleme, dass dann die Picturebox eine Exception geschmissen
hat, dass sie ihre Daten nicht locken kann.
Wie kann ich das schöner lösen?
C.
> Ich will
Was ich eigentlich will ist sowas wie die Image.Source-Eigenschaft, die
es für WPF gibt ( http://msdn.microsoft.com/en-
us/library/system.windows.controls.image.source.aspx )
Das mit CreateFileMapping etc. geht da sehr gut.
C.
Ich habe jetzt das gute alte StretchBlt genommen. Funktioniert
wunderbar. Voraussetzung war, dass Bitmap.GetHbitmap auch geht, wenn das
Bitmap gelockt ist. Und das geht. Somit kann man über die BmpData die
Daten in die Bitmap reinstrudeln und gleichzeitig in einer OnPaint
StretchBlt verwenden.
C.