Screenshot - sofort verarbeiten, nicht in Datei schreiben



  • Hallo Leute,

    folgendes Problem: ich möchte gern einen Screenshot von einem Ausschnitt eines Fensters machen. Dies klappt auch - allerdings nur, wenn ich "das Ergebnis in eine Datei schreibe". Dass heißt im unten folgenden Quelltext werden die Daten nur richtig in das Array geschrieben, wenn das mittlere Codesegment vorher ausgeführt wird. Lasse ich ihn weg, so steht im Array immer ein und dieselbe Zahl. Daraus schließe ich, dass ich irgendeinen der Befehle benötige, anscheinend das

    aBmp=CreateDIBSection(SourceDC,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL);
    

    damit der Code richtig arbeitet. Nun bezieht sich diese Funktion aber auf den BitmapInfoHeader etc. und den brauche ich nicht.

    Meine konkrete Frage: Welchen Code muss ich statt des mittleren Codesegmentes einfügen, dass das Array richtig gefüllt wird?

    Viele Grüße
    Richard

    char* Client::GetPixelField(void)
    {
    	HDC SourceDC = GetWindowDC(this->hMessageWin);			/* create a device context for the message window */
    	HDC DestDC = CreateCompatibleDC(SourceDC);
    
    	RECT rect;										/* resolution of the message window */
    	GetWindowRect(this->hMessageWin, &rect);		/* get window size */
    	int width = rect.right-rect.left;				/* calculate width */
    	int height = rect.bottom-rect.top;				/* calculate height */
    
    	unsigned long detected_color[86][209];			/* to save the last line of the message win */
    
    HBITMAP aBmp;
        BITMAPINFO bi;
        HGDIOBJ OldObj;
        void *dibvalues;
        HANDLE fileHandle;
    
        BITMAPFILEHEADER bmfh;
        BITMAPINFOHEADER bmih;
        DWORD bytes_write;
        DWORD bytes_written;
    
        ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
        bmih.biSize=sizeof(BITMAPINFOHEADER);
        bmih.biHeight=height-0;
        bmih.biWidth=width-0;
        bmih.biPlanes=1;
        bmih.biBitCount=24; //24
        bmih.biCompression=BI_RGB;
        bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
        bmih.biXPelsPerMeter = 0;
        bmih.biYPelsPerMeter = 0;
        bmih.biClrImportant = 0;
    
        bi.bmiHeader=bmih;
    
        aBmp=CreateDIBSection(SourceDC,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL);
    
        if (aBmp==NULL)
        {
            OutputDebugString("CreateDIBSection failed!\n");
            return 0;
        }
    
    	OldObj=SelectObject(DestDC,aBmp);
    
    BitBlt(DestDC,0,0,width,height,SourceDC,0,0,SRCCOPY);
    
         //Pixel auslesen
    	for(int y_counter=0;y_counter < height; y_counter++)
    		for(int x_counter=0; x_counter < width; x_counter++)
    			detected_color[y_counter][x_counter] = GetPixel(DestDC, x_counter,y_counter);
    
    	return NULL;
    }
    


  • Ich habe das Problem selbst lösen können. Für alle Interessierten hier der Quellcode:

    HDC SourceDC = GetWindowDC(this->hMessageWin);			/* create a device context for the message window */
    	HDC DestDC = CreateCompatibleDC(SourceDC);
    
    	HBITMAP hBitmap;										/* handle to the bitmap */
    
    	RECT rect;										/* resolution of the message window */
    	GetWindowRect(this->hMessageWin, &rect);		/* get window size */
    	int width = rect.right-rect.left;				/* calculate width */
    	int height = rect.bottom-rect.top;				/* calculate height */
    
    	unsigned long detected_color[86][209];			/* to save the last line of the message win */
    
    	hBitmap = CreateCompatibleBitmap (SourceDC, width, height);		/* create a bitmap compatible with the device associated with the device context */
    
    	SelectObject(DestDC, hBitmap);
    	BitBlt(DestDC,0,0,width,height,SourceDC,0,0,SRCCOPY);
    
         //Pixel auslesen
    	for(int y_counter=0;y_counter < height; y_counter++)
    		for(int x_counter=0; x_counter < width; x_counter++)
    			detected_color[y_counter][x_counter] = GetPixel(DestDC, x_counter,y_counter);
    
    	DeleteObject(hBitmap);				// delete the bitmap object and free all resources associated with it
      	DeleteDC(SourceDC);					// delete the device contexts
    	DeleteDC(DestDC);
    
    	return NULL;
    


  • GetPixel() ist allerdings gegenüber dem Pixel-Array der DIB um einiges lahmer 😉


Anmelden zum Antworten