screenshot auf z.B. 800*600 verkleinern
-
hallo,
ich habe hier einen code der ein screenshot macht und
ihn im bmp-format auf der hdd abspeichert.der screenshot ist dank GetSystemMetrics() so groß wie die
auflösung... nur ich würde den screenshot gerne auf z.b: 800*600
verkleinern.wenn ich die werte 800 und 600 festlege, wird das bild allerdings
nicht verkleinert, sondern nur 800*600 bildpunkte gespeichert.ich hoffe ihr wisst was ich machen möchte
und ich weis nicht ob
es leicht wird oder nicht, würde mich deswegen über antworten freuen.hier der ganze code:
#include <windows.h> #include <stdlib.h> #include <string> #include <sstream> #include <iostream> #include <stdio.h> using namespace std; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIsntance, LPSTR lpCmdine, int nShowCmd) { HDC hdc, hdc2; int width,height; width = GetSystemMetrics(SM_CXSCREEN); height = GetSystemMetrics(SM_CYSCREEN); char *filename="c:\\desk.bmp"; hdc=GetDC(NULL); HBITMAP aBmp; BITMAPINFO bi; HGDIOBJ OldObj; void *dibvalues; HANDLE fileHandle; BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; DWORD bytes_write; DWORD bytes_written; hdc2=CreateCompatibleDC(hdc); ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); bmih.biSize=sizeof(BITMAPINFOHEADER); bmih.biHeight=height; bmih.biWidth=width; bmih.biPlanes=1; bmih.biBitCount=16; bmih.biCompression=BI_RGB; bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrImportant = 0; //bmih.biSizeImage=(3*bmih.biHeight*bmih.biWidth); //bmih.biSizeImage = 0; bi.bmiHeader=bmih; aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL); if (aBmp==NULL) { OutputDebugString("CreateDIBSection failed!\n"); } OldObj=SelectObject(hdc2,aBmp); BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY); ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER)); bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmfh.bfType=0x4d42; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); if (fileHandle==INVALID_HANDLE_VALUE) { OutputDebugString("CreateFile failed!\n"); } // Write the BITMAPFILEHEADER bytes_write=sizeof(BITMAPFILEHEADER); if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); } //Write the BITMAPINFOHEADER bytes_write=sizeof(BITMAPINFOHEADER); if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); } //Write the Color Index Array??? bytes_write=bmih.biSizeImage;//3*bmih.biHeight*bmih.biWidth; if (!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); } CloseHandle(fileHandle); DeleteObject(SelectObject(hdc2,OldObj)); DeleteDC(hdc2); }danke schonmal, Babel
-
BitBlt() durch StretchBlt() ersetzen und height/width an einigen Stellen abändern...
...oder das ganze mit GDI+ machen (was z.B. den Vorteil hat, das die Qualität beim resizen besser ist und du Bitmaps z.B. auch als png, jpg und gif speichern kannst...)
-
ok, ich habe die zeile nun so umgeschrieben:
StretchBlt(hdc2,0,0,800,600,hdc,0,0,width,height,SRCCOPY);nur das problem ist das das bild dann immernoch widthheight groß ist.
es sind zwar nur 800600 pixel so gefüllt wie ich es wollte... aber auch
die dateigröße hat sich halt nicht verändert, und das war auch eines meider
ziele!also wie kann ich es noch machen das das bild dann nur 800*600 groß ist?
aber danke schonmal, Babelduo
-
das Bitmap, welches in hdc2 steckt muss dann natürlich auch nur noch 600*800 Pixel groß sein
-
stimmt

danke