Screenshot mit beliebigen Farbwerten
-
Hi @ All.
Ich habe vor, einen screenshooter zu erstellen, der den Shot in verschiedenen Farbwerten erstellen kann.
Dazu habe ich bereits etwas ausprobiert. Als erstes wollte ich einen 8Bit-screenshot erstellen.
Aber das will nicht so richtig gehen.#pragma comment(lib,"shlwapi.lib") #pragma comment(lib, "Msimg32.lib") #pragma comment(lib,"Gdi32.lib"); #define _WIN32_WINNT 0x0500 #include <windows.h> #include <shlwapi.h> #include <math.h> #include <time.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { // First of all, get desktop dc, rectangle HDC hDesktopDC = GetDC(0); RECT rDesktop; GetClientRect(GetDesktopWindow(),&rDesktop); // Now create the new screenshot HDC hScreenshotDC = CreateCompatibleDC(hDesktopDC); HBITMAP hScreenshotBitmap = CreateCompatibleBitmap(hDesktopDC,rDesktop.right-rDesktop.left,rDesktop.bottom-rDesktop.top); SelectObject(hScreenshotDC,hScreenshotBitmap); RECT rScreenshot = rDesktop; BITMAPINFO biScreenshot; biScreenshot.bmiColors[0] = 8; GetDIBits(hScreenshotDC, hScreenshotBitmap, 0,rDesktop.bottom-rDesktop.top, NULL, biScreenshot, DIB_PAL_COLORS); BitBlt(hScreenshotDC, 0,0, rDesktop.right-rDesktop.left,rDesktop.bottom-rDesktop.top, hDesktopDC, rDesktop.left,rDesktop.top, SRCCOPY); DWORD dwMilliseconds = 10000; DWORD dwStart,dwNow; dwStart = dwNow = GetTickCount(); while ((dwNow-dwStart <= dwMilliseconds) && (dwNow >= dwStart)) { BitBlt(hDesktopDC, rDesktop.left,rDesktop.top, rDesktop.right-rDesktop.left,rDesktop.bottom-rDesktop.top, hScreenshotDC, 0,0, SRCCOPY); Sleep(40); dwNow = GetTickCount(); } return 0; }Wäre sehr dankbar, wenn einer helfen könnte.
-
Was mir spontan auffällt: Die Farbtiefe setzt man nicht über bmiColors (das wäre die Farbpalette)
Bei biScreenshot.bmiHeader setzt du die gewünschte Farbtiefe und sonstiges Zeugs!
-
Tja... scheiße wenn man nur "Copy & Past" programmierung verwendet...
-
was???
@gosha16: willste mich verarschen!!!
das hab ich mir alles selber geschrieben.@geeky: ja. aber danke für den header-info
-
Tut mir leid das ich dir das nciht glauben kann
Wenn dann hättest du es wohl auch verstanden...
-
das ist nicht wahr.
das mit dem GetDC und der CreateCompatibleDC/Bitmap-Variante schon, aber das mit dem GetDIBits oder sowas war mir neu und deswegen habe ich gedacht, mann muss die Zahl da so reinschreiben.
sry.
-
so,ich hab jetz
biScreenshot.bmiHeader.biBitCount = 8;muss ich die bitmap-infostruktur vorher von dem hBitmap laden oer wie mache ich dass? das will nicht so richtig gehen.
thx.
-
msdn schrieb:
If the lpvBits parameter is a valid pointer, the first six members of the BITMAPINFOHEADER structure must be initialized to specify the size and format of the DIB.
-
Hi !
Du brauchst folgende Strukturen und Variablen:BITMAPINFO* pbi;
BITMAPINFOHEADER bmih;
BITMAPFILEHEADER bmfh;
unsigned char* dibwerte;Wenn du den Screenshot speichern willst, müssen
bmih und bmfh korrekt initialisiert sein !
( bmih.biPlanes = 1 nicht vergessen zu setzen, bmfh.bfType = 0x4D42 usw... )DIB_RGB_COLORS als Parameter verwenden, dann werden RGBQUADS als Farbtabelle geschrieben und du kannst den Screenshot auch in Paint oder anderen Grafikprogrammen bearbeiten.
In pbi muss der Header und die Farbtabelle reinpassen, also
( 1 << bits_pixel ) * sizeof( RGBQAD ) Bytes haben.Wenn bits_pixel > 24 ist, entfällt die obige Zeile.
Zeiger setzen:
pbi->bmiHeader = bmih;Du rufst GetDIBits ohne Puffer für die Pixeldaten auf, aber die Farbwerte müssen ja irgendwo rein also musst du nen
Puffer für die Pixelwerte organisieren ( char* dibwerte ), Größe des Puffers:
((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight
Bytes.GetDIBits nach BitBlt aufrufen.