mit manchen spielen geht das wuinderbar, mit anderen bekomme ich ein komplett schwarzes bild:
using (Graphics gx = Graphics.FromImage(screenShot))
{
gx.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size);
}
Wie kann ich von so einem einem störrischen spiel jatzt screenshots machen?
Edit: ich hab erst jetzt bemerkt, dass das spiel ned directx, sondern opengl benutzt!
Hallo floste,
man kann in DirectX das erstellen von Screenshots in den PresentParams verbieten, vllt ist das dein Problem.
mfg.
markus111
Lies lieber den framebuffer direct aus: ReadPixels. Ein Beispiel unter Verwendung von OpenTK:
BitmapData bmpData = bitmap.LockBits(bounds,ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
// reset any changes to pixel store
GL.PixelStore(PixelStoreParameter.UnpackAlignment,4.0f);
GL.PixelStore(PixelStoreParameter.UnpackRowLength,bmpData.Width);
GL.PixelStore(PixelStoreParameter.UnpackSkipRows,bounds.Y);
GL.PixelStore(PixelStoreParameter.UnpackSkipPixels,bounds.X);
GL.ReadPixels(0,0,bounds.Width,bounds.Height,OpenTK.Graphics.PixelFormat.Bgr,
PixelType.UnsignedByte,(IntPtr)bmpData.Scan0);
bitmap.UnlockBits(bmpData);
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. bei GL.PixelStore
Muss ich den code im prozess des Spiels ausführen oder wie?
die zeilen mit pixelstore brauchst du ggf. auch gar nicht.
==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET
bei csGl seh ich ohne mal wieder schwarz.
bei OpenTK wieder null reference
Grr ich hab jetzt mal reflektiert, was da los is und es gibt nen delegaten für jede funktion. der ist null.
hm, ja. Du musst die Lib schon richtig initialisieren. Lies Dir mal die Doku durch, bitte 😉 Womit machst Du denn den ganzen anderen OpenGL Kram? Also welche Bindings nimmst Du sonst? OpenTK war ja auch nur mein Beispiel, weil ich das nutze. Sonst machs doch einfach genauso, wie Du sonst Begin(..) und End() benutzt!
==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET
Das is garned mein spiel sondern ein fertiges in nem anderen prozess! Deshalb hab ich mich auch gefragt, ob ich das im selben prozess oder sogar im selben thread ausführen muss.... (vllt. irgendne opengl-funktion hooken?)
Hätte nie gedacht, dass es so schwer sein kann, an die bilddaten auf dem Bildschirm zu kommen.
Ah. verstehe. Ja, das sollte vom selben Thread ausgeführt werden, der auch den OpenGL-Kontext erzeugt hat. Schlimmstenfalls - falls Du da nicht ran kommst - müsstest Du die Daten aber auch direkt vom Screen lesen können? (Dann gäbe es aber evtl. noch Synchronitäts-Issues zu beachten, könnt ich mir vorstellen. )
==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET
Juchu!!!!!!!! Es klappt!!!
War allerdings etwas kompliziert:
Also: Mit meinem Snippet ( Globale Hooks mit c# (nichtnur lowlevel) unten) injeziere ich meine Anwendung in das Spiel und erstelle mit einkopilieren Easyhook einen Hook auf "wglSwapBuffers". Dort rufe ich dann "glReadPixels" auf. Die Bilder stehen allerdings komischerweise auf dem Kopf^^.