JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ad435b1c0cf9d8c4efe441a9e177c57fMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Screenshot erstellen und speichern
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 19.02.2005, 15:23    Titel: Screenshot erstellen und speichern Antworten mit Zitat

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 Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 15:50    Titel: Antworten mit Zitat

1. API
2. Betriebssystem
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cout <<
Mini JLI'ler



Anmeldedatum: 13.02.2004
Beiträge: 48
Wohnort: Wien/Österreich
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:07    Titel: Antworten mit Zitat

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 Wink
schau mal hier nah
http://www.win-api.de/tutorials.php?SessID=cf74162bae8fef7854ace48763b4e86a&SessID=cf74162bae8fef7854ace48763b4e86a
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cout <<
Mini JLI'ler



Anmeldedatum: 13.02.2004
Beiträge: 48
Wohnort: Wien/Österreich
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:34    Titel: Antworten mit Zitat

Ok, Danke für die Antworten Smile

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:37    Titel: Antworten mit Zitat

@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. Wink

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, 17:01, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cout <<
Mini JLI'ler



Anmeldedatum: 13.02.2004
Beiträge: 48
Wohnort: Wien/Österreich
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 16:48    Titel: Antworten mit Zitat

Danke, voll nett von euch Smile

Ich werde mir die beiden Artikel demnächst zu Gemüte führen^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 17:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 17:50    Titel: Antworten mit Zitat

City Hunter hat Folgendes geschrieben:

Jo er meint API muss man koennen, API ist C++ und zweiten meint er woll welches Betriebsystem du hast Wink


Totalschaden ^^

KI
Wie immer deutest du meine Auflistung richtig Wink

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. Smile
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cout <<
Mini JLI'ler



Anmeldedatum: 13.02.2004
Beiträge: 48
Wohnort: Wien/Österreich
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 17:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 18:10    Titel: Antworten mit Zitat

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, 18:25, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
cout <<
Mini JLI'ler



Anmeldedatum: 13.02.2004
Beiträge: 48
Wohnort: Wien/Österreich
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 18:24    Titel: Antworten mit Zitat

Yeah, klappt Smile

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 Sad *kaputtlach*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.02.2005, 18:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
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

Impressum