Screenshot unter 500KB
-
Hi schrieb:
dazu noch Dithering-Level ein wenig herunterschraubst
Hey, danke für deine Antwort
Habe jetzt den
BInfoHeader->biBitCount = 16;
zu
BInfoHeader->biBitCount = 8;
umgetauscht, aber ich verstehe nicht ganz was du mit Dithering-Level meinst.
EDIT :
Ich glaube das so umzutauschen war nicht was du meinst, jetzt ist das Bild komplett grau O.o
-
Hier ein Artikel dazu: http://de.wikipedia.org/wiki/Dithering_(Bildbearbeitung)
Ich habe durch das Senken des Dithering-Levels jedoch nur bei der PNG-Datei eine kleinere Größe bekommen. Beim Bitmap machte das keinen Unterschied.
Ob du das hinbekommst kann ich dir nicht sagen, musst Du selbst Googeln.Du könntest auch JPEG verwenden. Ist ein sehr sparsames Format und hat trotzdem eine super Qualität.
-
Danke für den Wikipedia Link, aber gibt es da nicht eine einfachere Möglichkeit ?
Ich glaube meinem Programm ist es völlig egal obs PNG, JPG, JPEG oder sonst was ist O.o
-
Schau mal hier: http://stackoverflow.com/a/1034609
Dort wird deine Frage beantwortet. Dort wird das Bild als .jpeg abgespeichert.
-
Danke für den Link,
Leider funktionieren die Beispiele nur mit GDIplus
Trotzdem danke
-
Und warum willst Du Gdiplus nicht verwenden?
-
TimDerVerzweifelte schrieb:
volkard schrieb:
Besteht die Möglichkeit, sie nicht als BMP, sondern als PNG abzuspeichern?
Ja das Funktioniert aber das PNG hat dann trotzdem eine Größe von 7.91MB
Danke für den VersuchScreenshots von einer Anwendungen (ohne Hintergrundbild) werden als PNG total winzig.
Außerdem packt es verlustfrei.
JPG kommt da nicht mit, es wird größer und hat Farbabweichungen um die Buchstaben.Wenn im Bild Farbverläufe und sowas drin sind, dann halt JPG. Vor allem bei Fotos.
BMP ist einfach groß.
-
@Unregistriert :
Ich werde mich heute Abend mal an GDIplus dran setzen. Danke für die Hilfe@Volkard :
Ne bei mir leider nicht, egal welches Format es bleibt bei der Größe..
-
TimDerVerzweifelte schrieb:
@Volkard :
Ne bei mir leider nicht, egal welches Format es bleibt bei der Größe..Bei genau der Größe?
-
Es reicht nicht, einfach nur die Dateinamenerweiterung auf ".png" zu ändern - du mußt schon eine entsprechende PNG-Library verwenden (bezogen auf deinen 2. Code)!
-
TimDerVerzweifelte schrieb:
//Make Screenshot keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); //Creates the Image std::ofstream a_file(filename); a_file.close(); //Sleep for a short while Sleep(10); //Opens the Image secretly ShellExecute(NULL, NULL, convertCharArrayToLPCWSTR("C:\\WINDOWS\\system32\\mspaint.exe"), convertCharArrayToLPCWSTR(filename), NULL, SW_HIDE ); //Sleep for a short while Sleep(30); //Sets paint to ForeGround HWND windowHandel = FindWindow(0, convertCharArrayToLPCWSTR("Paint")); SetForegroundWindow(windowHandel); //Paste Screenshot keybd_event(VK_CONTROL, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(86, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(86, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); //Paste Screenshot keybd_event(VK_F12, 0x45, KEYEVENTF_EXTENDEDKEY, 0); Sleep(300); keybd_event(VK_TAB, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_TAB, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_DOWN, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_DOWN, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_UP, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_UP, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_UP, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_UP, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_LEFT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_LEFT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_LEFT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_LEFT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_F12, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); //Save Screenshot keybd_event(VK_CONTROL, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(83, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(83, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
Ich habe Angst vor dir...
-
volkard schrieb:
TimDerVerzweifelte schrieb:
@Volkard :
Ne bei mir leider nicht, egal welches Format es bleibt bei der Größe..Bei genau der Größe?
Jap
Th69 schrieb:
Es reicht nicht, einfach nur die Dateinamenerweiterung auf ".png" zu ändern - du mußt schon eine entsprechende PNG-Library verwenden (bezogen auf deinen 2. Code)!
Okay wollte aber eigentlich es mit der WinApi schaffen, bzw. ohne Library.
-
hustbaer schrieb:
Ich habe Angst vor dir...
Warum ?
-
TimDerVerzweifelte schrieb:
Okay wollte aber eigentlich es mit der WinApi schaffen, bzw. ohne Library.
-
volkard schrieb:
TimDerVerzweifelte schrieb:
Okay wollte aber eigentlich es mit der WinApi schaffen, bzw. ohne Library.
Vielen Dank für den Google-Link.
Aber wie gesagt ich habe schon gegoogelt und bin es langsam Leid.
Der Link führt nur auf eine CLI seite bzw. wieder auf GDI+.
Könnte mir nicht irgendwer einen Denkanstoß geben, veröffentliche dann auch meinen Code.
-
Was ist denn nun dein Problem mit GDI+? Alternativ kannst du WIC verwenden. Oder einen eigenen PNG-Encoder schreiben.
-
GDI+ ist doch (seit Windows XP) Teil der WinAPI.
Was ist dein Problem damit?
-
Th69 schrieb:
GDI+ ist doch (seit Windows XP) Teil der WinAPI.
Was ist dein Problem damit?So ist es.
Im MSDN Beispiel "Setting JPEG Compression Level" ist (fast) alles drin, was man braucht um ein BMP als
JPG zu speichern. Man muss noch die GetEncoderClsid() dazukopieren und die Gdiplus.lib dazulinken.
Windows GDI+ kann Images als BMP,GIF,JPEG,PNG,TIFF und einiges andere speichern. Als Feature kann
man im Beispiel sogar noch die quality zwischen 0 .. 100 einstellen!http://msdn.microsoft.com/en-us/library/windows/desktop/ms533814.aspx
Das ganze kompiliert als Win32 Konsolenanwendung mit VS2010 unter XP fehlerfrei.
-
Du gehst das falsch an. Du meinst, du kannst dir aus dem Internet einfach was zusammenkopieren ohne es zu verstehen und das funzt. Das funzt aber leider nicht.
Das einzige was du brauchst, ist das hier:// get the device context of the screen HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); // and a device context to put it in HDC hMemoryDC = CreateCompatibleDC(hScreenDC); int x = GetDeviceCaps(hScreenDC, HORZRES); int y = GetDeviceCaps(hScreenDC, VERTRES); // maybe worth checking these are positive values HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDc, x, y); // get a new bitmap HBITMAP hOldBitmap = SelectObject(hMemoryDC, hBitmap); BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY); hBitmap = SelectObject(hMemoryDC, hOldBitmap); // clean up DeleteDC(hMemoryDC); DeleteDC(hScreenDC);
http://stackoverflow.com/questions/3291167/how-to-make-screen-screenshot-with-win32-in-c
Das ist der Code um einen Screenshot vom Desktop zu machen.
Wenn du das als BMP abspeicherst, hast du natürlich eine riesige Datei.
Dann der Spruch "ich will das aber nur mit WinAPI machen und ohne Library" entspricht ungefähr dem equivalent von "klar ich laufe gerne über heisse kohlen mit einem Messer im Rücken". Auf Low Level Shit zu bestehen bringt dich auch nicht weiter. Als lass den scheiss und machs richtig. Benutz ne image lib wie freeimage oder libpng und speichers als PNG, JPG oder was auch immer um die Zielgröße zu erreichen. Oder benutz halt GDI+.
Aber hör auf dir Code zusammenzukopieren ohne ihn im Ansatz zu verstehen.
Vor allem sowas schreckliches wie dein erster Code Teil mit den Haufen fake keyboard inputs.
Rechtschreibfehler sind mir grade wurscht, is spät. Gute Nacht.
-
Scorcher24 schrieb:
Das einzige was du brauchst, ist das hier:
HWND DesktopHwnd = GetDesktopWindow(); RECT DesktopParams; HDC DevC = GetDC(DesktopHwnd); GetWindowRect(DesktopHwnd,&DesktopParams); DWORD Width = DesktopParams.right - DesktopParams.left; DWORD Height = DesktopParams.bottom - DesktopParams.top;
Das ist der Code um einen Screenshot vom Desktop zu machen.
Der Code macht wohl noch keinen Screenshot, aber es ist der richtige Weg als Basis des "gefundenen" Code aus
void ScreenShot(char* BmpName)
zu verwenden und die Bitmap platzsparend in einem effizienten Format wie JPG zu speichern.
Alle dafür notwendigen Quellen wurden hier bereits angesprochen.
Scorcher24 schrieb:
Vor allem sowas schreckliches wie dein erster Code Teil mit den Haufen fake keyboard inputs.
Der Code ist so schrecklich, das ich ganz schnell drüber wegscrollen musste. Das man sowas überhaupt
versucht und es tatsächlich zu einer Lösung kommt - wenn auch einer eher schlechten - ist auf jeden Fall
mal ein Lösungsansatz.Viel schlimmer finde ich Leute, die garnichts recherchiert haben und die "gebratenen Tauben" erwarten.
Den Code mit den keyboard inputs bitte schnell abhaken und den anderen Code
verwenden.