Element in Bitmap capturen
-
Hallo Leute,
folgendes Problem:
ich will von verschiedenen Steuerelementen die Bilddaten abgreifen. zum einen von einem videopanel, welches momentan videos über directx.audiovideoplayback funktioniert, zum anderen von einer Picture Box.
ich hab es schon mit diversen projekten von codeproject.com versucht jedoch ohne erfolg.
http://www.codeproject.com/cs/media/directxcapture.asp
wenn ich versuche dieses projekt einzubinden und das erste beispiel zum laufen zu bekommen startet er nicht einmal, sondern bricht sofort ab. - Grund:Capture capture = new Capture( Filters.VideoInputDevices[0],
Filters.AudioInputDevices[0] );ich kann diese Zeile so nicht schreiben. bei mir wird nach "Filters" "VideoInputDevices" nicht angezeigt.
seine Demo zu starten klappt auch nicht. - daher gehe ich davon aus dass es wohl irgendwie am directx liegt!?
daher habe ich mir directx feb2007 komplett geladen und installiert. aber es läuft immer noch nicht.kennt jemand von euch einen effektiven/besseren weg eine video darzustellen und dann auf die bilddaten zuzugreifen (in ein Bitmap-variable). und vor allem gibt es dann eine effektivere variante an das Pixel-array zu kommen als mit getpixel.
MfG
metaljack
-
Sieht von hier so aus, als hättest Du vergessen, die DShowNET.dll zu Deinem Projekt hinzuzufügen ...
-
also. für das live mitschneiden eines bildausschnitts hab ich ne lösung gefunden.
es gibt in der klasse Graphics eine funktion die heißt "CopyFromScreen".
jedoch hab ich jetz immernoch das problem dass ich nicht an das pixelarray komme.
kann mir da jemand weiterhelfen. dummerweise ist es jetz n graphics und kein bitmap.MfG metaljack
-
okay. das mit dem pixelarray habsch hinbekommen.
aber weiß zufällig jemand wie ich dieses array jetz als bild auf den bildschirm bekomme?
-
wieder in eine Bitmap verpacken
(Bitmap erzeugen, SetPixel oder LockBits...)Die meisten Windows-Controls unterstützen auch die WM_PRINT-Nachricht (Zeichnen in ein mit-übergebenen Device-Context) bzw. taucht bei Windows.Forms dann oft die Eigenschaft .DrawToBitmap() auf.
Hmm, einfacher als CopyFromScreen() wird das allerdings wohl eher nicht sein
-
also ich versuch das jetz mit der lockbits methode. aber der bringt mir immer nen fehler von wegen ungültiger Parameter.
was läuft falsch?public static Bitmap Get_Bitmap(byte[] pixels,Rectangle rect) { Bitmap bmp=new Bitmap(rect.Width,rect.Height); System.Drawing.Imaging.BitmapData bmpData=bmp.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,System.Drawing.Imaging.Pixelformat.Format8bppIndexed); IntPtr ptr=bmpData.Scan0; System.Runtime.InteropServices.Marshal.Copy(pixels,0,ptr,rect.Height,rect.Width); return bmp; }
fehler kommt in zeile 2;
8bit pro pixel stimmen.
rect=40x32 und das array is auch dem entsprechend 1280byte groß.also eigentlich möcht ich ja mein bild in graustufen haben. hab dazu jetz auch mein array doppelt so groß gemacht und das pixelformat auf 16bppGrayScale gestellt. aber der fehler is immernoch da
-
so ich habs jetz etwas umgemodelt. es gibt nämlich nen bitmap-konstruktor mit dem ptr auf die pixeldaten. mein einziges problem ist genau dieser IntPtr.
public Bitmap ( int width, int height, int stride, PixelFormat format, IntPtr scan0
wie bekomm ich ihn dazu das der IntPtr auf mein array zeigt?