|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
cout << Mini JLI'ler
Anmeldedatum: 13.02.2004 Beiträge: 48 Wohnort: Wien/Österreich Medaillen: Keine
|
Verfasst am: 19.02.2005, 14:23 Titel: Screenshot erstellen und speichern |
|
|
Hallo,
ich bin auf der Suche nach einen kleinen C++ Programm, das einen Screenshot erstellen soll und dann unter einem selbstdefinierten Pfad+Dateinamen speichern soll. (wenn möglich als JPEG Datei)
Ich hab' schon in Google und in einigen Foren gesucht, hab' aber dann die lange Suche für ein Quelltextbeispiel aufgegeben.
Ich bin leider nicht so der C++ Programmierer (hab' Christians Buch schon seit Langem, aber aus schulischen Gründen mach ich jetzt Java), eher Java...aber ich brauch aus Geschwindigkeitsgründen eine Screenshot Funktion in C++, um diese dann performant aus meinem Java-Programm aufrufen zu können.
Vielleicht kennt ihr aus eigenen Erfahrungen ein Tutorial oder Code-Beispiel, das mir weiterhelfen könnte.
Danke im voraus |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
cout << Mini JLI'ler
Anmeldedatum: 13.02.2004 Beiträge: 48 Wohnort: Wien/Österreich Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:01 Titel: |
|
|
Sorry, ich will jetzt nicht frech klingen...
...aber deine Infos helfen mir nicht wirklich weiter. Wie schon gesagt, ich bin eher Java-Programmierer und kenne mich mit C++ so gut wie nicht aus. Aber ich benötige dennoch eine Funktion in C++, um Screenshots zu erstellen und speichern. Ich will jetzt nicht andeuten dass ich faul bin, aber ich will wegen dieser einmaligen Problemstellung nicht 10 Bücher wälzen.
Deswegen hatte ich hier auf etwas konkretere Hilfe gehofft... |
|
Nach oben |
|
|
City Hunter Super JLI'ler
Alter: 39 Anmeldedatum: 18.04.2004 Beiträge: 330 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:07 Titel: |
|
|
cout << hat Folgendes geschrieben: | Sorry, ich will jetzt nicht frech klingen...
...aber deine Infos helfen mir nicht wirklich weiter. Wie schon gesagt, ich bin eher Java-Programmierer und kenne mich mit C++ so gut wie nicht aus. Aber ich benötige dennoch eine Funktion in C++, um Screenshots zu erstellen und speichern. Ich will jetzt nicht andeuten dass ich faul bin, aber ich will wegen dieser einmaligen Problemstellung nicht 10 Bücher wälzen.
Deswegen hatte ich hier auf etwas konkretere Hilfe gehofft... |
Jo er meint API muss man koennen, API ist C++ und zweiten meint er woll welches Betriebsystem du hast
schau mal hier nah
http://www.win-api.de/tutorials.php?SessID=cf74162bae8fef7854ace48763b4e86a&SessID=cf74162bae8fef7854ace48763b4e86a |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:16 Titel: |
|
|
Lad dir mal den GIMP Quellcode runter da gibts eine Möglichkeit einen Desktop oder Fensterscreenshot zu erstellen. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
cout << Mini JLI'ler
Anmeldedatum: 13.02.2004 Beiträge: 48 Wohnort: Wien/Österreich Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:34 Titel: |
|
|
Ok, Danke für die Antworten
Wegen dem GIMP Sourcecode werde ich mal schauen, aber um die API zu lernen reicht mir leider nicht die Zeit.
Achja, ich verwende Windows XP, falls euch das weiterhelfen sollte. |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:37 Titel: |
|
|
@cout <<
Ich schätze mal das war als Frage gedacht.
patrick wollte wissen wlche API du benutzt und welches OS.
Du meinst höchstwahrscheinlich Windows in Verbinung mit der Windows API.
Den Bildschrim in eine HBITMAP zu speichern ist nicht das Problem.
edit: der code ist nicht gut gewesen. ich werde später besseren posten. der von msdn ist leider auch nicht das gelbe vom ei.
Das ist jetzt etwas abgewandelter Code aus der MSDN.
Dort gibt es einen Artikel zum Thema Capturing an Image und Storing an Image.
Ich kann später mal etwas Code posten...
Zuletzt bearbeitet von KI am 19.02.2005, 16:01, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:38 Titel: |
|
|
Also ich hab mir dne Sourcecode mal runtergeladen. Die benützten da eine gdk funktion die "gdk_pixbuf_get_from_drawable" heisst. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
cout << Mini JLI'ler
Anmeldedatum: 13.02.2004 Beiträge: 48 Wohnort: Wien/Österreich Medaillen: Keine
|
Verfasst am: 19.02.2005, 15:48 Titel: |
|
|
Danke, voll nett von euch
Ich werde mir die beiden Artikel demnächst zu Gemüte führen^^ |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 19.02.2005, 16:46 Titel: |
|
|
Folgender Code macht einen Screenshot und speichert ihn als 32-Bit Bitmap.
CPP: | HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
int iWidth = GetDeviceCaps(hdcScreen, HORZRES);
int iHeight = GetDeviceCaps(hdcScreen, VERTRES);
HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen,
iWidth,
iHeight);
HBITMAP hbmOldBitmap = (HBITMAP)SelectObject(hdcCompatible, hbmScreen);
BitBlt(hdcCompatible,
0,0,
iWidth,
iHeight,
hdcScreen,
0,0,
SRCCOPY);
/* Nun Speicher für einen Puffer reservieren, der die Daten
der 32-Bit-Bitmap temporär aufnimmt. */
DWORD dwImageSize = (DWORD)(iWidth * iHeight * 32 / 8 );
//void *pImage = HeapAlloc(GetProcessHeap(), 0, dwImageSize); // oder so
void *pImage = new BYTE[dwImageSize];
/* Als Nächstes Daten der 32-Bit-Bitmap in den Puffer laden. */
BITMAPINFO bmi =
{
sizeof(BITMAPINFOHEADER),
iWidth,
iHeight,
1,
32,
BI_RGB,
0,
0,
0,
0,
0
};
GetDIBits(hdcCompatible, hbmScreen, 0, (UINT)iHeight, pImage, &bmi, DIB_RGB_COLORS);
/* Neue Datei erstellen. */
HANDLE hFile = CreateFile(
".\\screenhot.bmp",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return MessageBox(NULL, "CreateFile failed.", "Failure", MB_ICONERROR);
}
/* Jetzt Header für Bitmap präparieren. */
BITMAPFILEHEADER bmpfh =
{
'MB',
sizeof(BITMAPFILEHEADER),
0,
0,
sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
};
/* Nun Header für Bitmap in Datei schreiben. */
DWORD dwWritten;
if(!WriteFile(hFile, &bmpfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPFILEHEADER))
{
return MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
}
if(!WriteFile(hFile, &bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPINFOHEADER))
{
return MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
}
/* Anschließend Image in Datei schreiben. */
if(!WriteFile(hFile, pImage, dwImageSize, &dwWritten, NULL) || dwWritten != dwImageSize)
{
return MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
}
SelectObject(hdcCompatible, hbmOldBitmap);
delete pImage;
DeleteObject(hbmScreen);
DeleteDC(hdcScreen);
DeleteDC(hdcCompatible);
|
|
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 19.02.2005, 16:50 Titel: |
|
|
City Hunter hat Folgendes geschrieben: |
Jo er meint API muss man koennen, API ist C++ und zweiten meint er woll welches Betriebsystem du hast |
Totalschaden ^^
KI
Wie immer deutest du meine Auflistung richtig
Ich wollte wissen: 1. Welche API (Direct3D, GDI, DirectDraw, SDL usw) du benutzt und 2. welches Betriebssystem (Windows, Linux)
Denn Deine Sachstellung war sehr brach. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
cout << Mini JLI'ler
Anmeldedatum: 13.02.2004 Beiträge: 48 Wohnort: Wien/Österreich Medaillen: Keine
|
Verfasst am: 19.02.2005, 16:53 Titel: |
|
|
Danke für das Programm...
...eine Frage: Jetzt muss ich unter Microsoft Visual C++ einen Win32 Konsolenanwendungs Arbeitsbereich erstellen und den Code in eine neu erstellte C++ Quellcodedatei kopieren und danach kompilieren/linken, oder? |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 19.02.2005, 17:10 Titel: |
|
|
Das reicht nicht. Es ist nur ein Codefragment.
Dafür brauchst du eine win32 windows-anwendung.(nicht konsolenanwendung)
Neu->Projekt->Win32...
Dann lässt du dir ne Standard-Fensteranwendung machen, entfernst den Fenster_erstellen-Kram und baust den Code ein.
Alternativ kannst du auch JLI-Beispielprojekte mit dem Code erweitern.
Zuletzt bearbeitet von KI am 19.02.2005, 17:25, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
cout << Mini JLI'ler
Anmeldedatum: 13.02.2004 Beiträge: 48 Wohnort: Wien/Österreich Medaillen: Keine
|
Verfasst am: 19.02.2005, 17:24 Titel: |
|
|
Yeah, klappt
Eine allerletztes mal muss ich euch noch nerven...mein Programm wird 30-60 Screenshots pro Sekunde erstellen und da ist es unmöglich die alle als bmp zu speichern. Was muss geändert werden, damit die Bilder als JPEG gespeichert werden?
@PeaceKiller: Geht leider nicht...mein Drucker ist erst vor Kurzem hin geworden *kaputtlach* |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 19.02.2005, 17:44 Titel: |
|
|
30-60 bilder Pro sekunde??????? Also da ist BMP abspeichern am schnellste, bei JPEG kommt noch komprimierung dazu und da bekommste bei hoher komprimierung nicht mal 2 pro sekunde hin _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|