screenshot
-
Ist hdc denn ein gültiger Wert?
Da der Fehler bei der ersten Möglichkeit auftritt und hdc der einzig fehlerträchtige Wert ist, den Du übergibst, solltest Du mal schauen ob GetWindowDC mit einem nicht initialisierten hWnd überhaupt einen vernünftigen Wert zurückliefert... ich bezweifle das.
-
Wenn du einen Screenshot vom gesamten Bildschirm willst kannst du GetWindowDC(NULL) bzw. GetDC(NULL) verwenden - aber so wirst du nicht viel holen können

-
ja möchte e den screenshot vom ganzen bildschirm;-)
hi!
wie initialisiere ich hWnd?
nur wenn ich so mache: hdc=GetWindowDC(NULL); dann geht da auch erst nicht!thx
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIsntance, LPSTR lpCmdine, int nShowCmd) { HDC hdc; RECT rt; HWND hWnd; int iBreite, iHoehe = 0; char szFilename[]="Bitmap.bmp"; int result=0; stringstream result1; hdc=GetWindowDC(NULL); GetWindowRect(hWnd,&rt); iBreite = rt.right - rt.left; // Wir brauchen die Differenz iHoehe = rt.bottom - rt.top; // also die Breite und Höhe des Fensters result = dc2bitmap(hdc, iBreite, iHoehe, szFilename); ReleaseDC(hWnd,hdc); result1 << "Rueckgabewert von dc2bitmap: " << result; MessageBox(NULL, result1, "info", MB_OK | MB_ICONINFORMATION); return 0; }
-
markoo schrieb:
ja möchte e den screenshot vom ganzen bildschirm;-)
hi!
wie initialisiere ich hWnd?
nur wenn ich so mache: hdc=GetWindowDC(NULL); dann geht da auch erst nicht!Weißt Du denn, was ein HWND ist?
Da Du den hWnd mittlerweile nur noch für die Größenbestimmung verwendest (was bei einem ungültigen HWND natürlich auch schief geht) könntest Du
hWnd = GetDesktopWindow();da reinpacken und zwar BEVOR Du mit GetWindowRect die Größe des hWnd abfragst...
Holt sich den FensterHandle zum Desktop, sollte zur Größenbestimmung vorerst ausreichen...
-
Hepi schrieb:
markoo schrieb:
ja möchte e den screenshot vom ganzen bildschirm;-)
hi!
wie initialisiere ich hWnd?
nur wenn ich so mache: hdc=GetWindowDC(NULL); dann geht da auch erst nicht!Weißt Du denn, was ein HWND ist?
Da Du den hWnd mittlerweile nur noch für die Größenbestimmung verwendest (was bei einem ungültigen HWND natürlich auch schief geht) könntest Du
hWnd = GetDesktopWindow();da reinpacken und zwar BEVOR Du mit GetWindowRect die Größe des hWnd abfragst...
Holt sich den FensterHandle zum Desktop, sollte zur Größenbestimmung vorerst ausreichen...
hi danke hepi...es funktioniert ja;-)
jedoch musste ich das so machen:......... hWnd=GetDesktopWindow(); hdc=GetWindowDC(hWnd); GetWindowRect(hWnd,&rt); iBreite = rt.right - rt.left; // Wir brauchen die Differenz iHoehe = rt.bottom - rt.top; // also die Breite und Höhe des Fensters result = dc2bitmap(hdc, iBreite, iHoehe, szFilename); ReleaseDC(hWnd,hdc);hWnd is ja nur zur Größenbestimmung...muss man da sonst noch was wissen?
cool ich kann das bild auch als jpg speichern;-) irgendwer hatte da mal problems...das jpg nicht geht oder? ka
thx

-
du frage hepi...kann ich irgendwo die qualität ändern mit dem das bild gespeichert wird? weil das sind sonst immer 2,25 mb!!! das wär noch cool!
thx
-
ich glaub das dürfte das sei oder:
bmih.biCompression=BI_RGB;was kann man da noch für compressionen nehmen?
thx
-
Das kannste in der MSDN: BITMAPINFOHEADER nachlesen...
-
ich hab da in der msdn nachgeschaut, danke noch mal für den tipp!
aber wenn ich eine andere kompression nehme dann schlägt der speichern plötzlich fehl!
zb.:bmih.biCompression=BI_BITFIELDS;folgende komressionen gibt es:
BI_RGB An uncompressed format.
BI_RLE8 A run-length encoded (RLE) format for bitmaps with 8 bpp. The compression format is a 2-byte format consisting of a count byte followed by a byte containing a color index. For more information, see Bitmap Compression.
BI_RLE4 An RLE format for bitmaps with 4 bpp. The compression format is a 2-byte format consisting of a count byte followed by two word-length color indexes. For more information, see Bitmap Compression.
BI_BITFIELDS Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks that specify the red, green, and blue components, respectively, of each pixel. This is valid when used with 16- and 32-bpp bitmaps.
BI_JPEG Windows 98/Me, Windows 2000/XP: Indicates that the image is a JPEG image.
BI_PNG Windows 98/Me, Windows 2000/XP: Indicates that the image is a PNG image.zusätzliche wichtige infos:
If biHeight is negative, indicating a top-down DIB, biCompression must be either BI_RGB or BI_BITFIELDS. Top-down DIBs cannot be compressed.Windows 98/Me, Windows 2000/XP: If biCompression is BI_JPEG or BI_PNG, the biHeight member specifies the height of the decompressed JPEG or PNG image file, respectively.
ich will das bild als jpg so unter 500kb bekommen!
thx
-
Ich nehme an, du hast das Bild eben nicht als JPEG gespeichert, sondern ihm einfach nur die Endung .jpg gegeben :p
Angesichts der Qualität würde ich dir aber eh eher PNG empfehlen
-
ok ich hab das so:
char szFilename[]="Bitmap.jpeg"; . . bmih.biCompression=BI_PNG; . .aber error:
C:\screen.cpp(59) : error C2065: 'BI_PNG' : nichtdeklarierter Bezeichnerwas brauch man noch?
-
markoo schrieb:
aber error:
C:\screen.cpp(59) : error C2065: 'BI_PNG' : nichtdeklarierter BezeichnerMein Gott, kannst du denn nicht in den Links nachschauen, die man dir gibt...
-
WebFritzi schrieb:
markoo schrieb:
aber error:
C:\screen.cpp(59) : error C2065: 'BI_PNG' : nichtdeklarierter BezeichnerMein Gott, kannst du denn nicht in den Links nachschauen, die man dir gibt...
tut mir leid webfritzi, vielleicht hab ich was überlesen....hab bisher nur das gesehn:
Windows 98/Me, Windows 2000/XP: If biCompression is BI_JPEG or BI_PNG, the biHeight member specifies the height of the decompressed JPEG or PNG image file, respectively
naja ich lies noch mal alles durch...
thx
-
Das biCompression-Member im BITMAPINFOHEADER gibt doch nur an, wie du die Daten in der Struktur speicherst - nicht, wie die Daten gespeichert werden. flenders hat dir einen Link gegeben. Geh diesem nach.
Und noch einmal zu deinem eigentlichen Vorhaben: In den FAQs (http://www.c-plusplus.net/forum/viewtopic.php?t=39400) hast du eine Funktion zum Abspeichern eines DCs. Das DC zum gesamten Bildschirm holst du dir mit GetWindowDC(NULL). Das kannste dann als Parameter in die Funktion einsetzen. Fertig.
-
WebFritzi schrieb:
Das biCompression-Member im BITMAPINFOHEADER gibt doch nur an, wie du die Daten in der Struktur speicherst - nicht, wie die Daten gespeichert werden. flenders hat dir einen Link gegeben. Geh diesem nach.
Und noch einmal zu deinem eigentlichen Vorhaben: In den FAQs (http://www.c-plusplus.net/forum/viewtopic.php?t=39400) hast du eine Funktion zum Abspeichern eines DCs. Das DC zum gesamten Bildschirm holst du dir mit GetWindowDC(NULL). Das kannste dann als Parameter in die Funktion einsetzen. Fertig.
hi webdritzi! das speichern klappt ja ansich wohl...aber halt nicht kompremiert, glaub hast mich bissi falsch verstanden...
libpng is the official PNG reference library...
ich versuch das mal mit #include "zlib.h"
mal schaun ob das nun geht..thx

-
Es ging eher darum: Image::Save Method
-
speichern?
aber was hat das mit dem error zu tun...es sieht aus als ob eine lib fehlt...oder meinst du das:
// Create an Image object based on a PNG file. Image image(L"Mosaic.png");als .png saven? bin glaub ich jetzt am falschen draht...*g* help!
thx
-
Imho, müsstest du - selbst wenn der BI_PNG-Fehler nicht kommen würde - das Bild dann selber 'händisch' komprimieren, das passiert dann nicht automatisch!
Die Methode unter flender's link ist da viiiieeeel einfacher - Du musst nicht selber komprimieren und nicht mit CreateFile() rumhampeln, etc...
und du könntest das sehr schnell auf z.B. jpeg umändern!
-
geeky schrieb:
Imho, müsstest du - selbst wenn der BI_PNG-Fehler nicht kommen würde - das Bild dann selber 'händisch' komprimieren, das passiert dann nicht automatisch!
Die Methode unter flender's link ist da viiiieeeel einfacher - Du musst nicht selber komprimieren und nicht mit CreateFile() rumhampeln, etc...
und du könntest das sehr schnell auf z.B. jpeg umändern!ach so....ich dachte das geht automatisch!!! bitte hilft mir mal
ich versuchs mal so zu machen:
int dc2bitmap(HDC hdc, int width, int height, char *filename) { Graphics graphics(hdc); // Create an Image object based on a PNG file. Image image(L+filename); // Draw the image. graphics.DrawImage(&image, width, height); // Construct a Graphics object based on the image. Graphics imageGraphics(&image); // Alter the image. SolidBrush brush(Color(255, 0, 0, 255)); imageGraphics.FillEllipse(&brush, 20, 30, 80, 50); // Draw the altered image. graphics.DrawImage(&image, 200, 10); // Save the altered image. CLSID pngClsid; GetEncoderClsid(L"image/png", &pngClsid); image.Save(L+filename, &pngClsid, NULL); }ich bekomme einige error:
zb.: error C2065: 'Graphics' : nichtdeklarierter Bezeichnerdiese Header braucht man: Gdiplusheaders.h, include gdiplus.h
aber ich kann die nicht finden!????
library hab ich nicht: gdiplus.libbitte um answere!
thx

-
markoo schrieb:
library hab ich nicht: gdiplus.lib
Na, woher wird deine Fehlermeldung dann wohl kommen? Ich verlinke dich auf die Seite, auf der du die gdiplus.dll bekommst.
EDIT: Das Geile ist: die von MS meinen zwar, man hätte standardmäßig diese DLL in WinXP dabei - ich habe sie nicht!