screenshot versenden ohne temp



  • hallo, ich habe damit einen screen gemacht:

    int Ctest::dc2bitmap(HDC hdc, int width, int height, char *filename)
    {
        HDC hdc2;
        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=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;
        //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");
            return 0;
        }
    
        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");
            return 0;
        }
    
            // Write the BITMAPFILEHEADER
            bytes_write=sizeof(BITMAPFILEHEADER);
        if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL))
        {
            OutputDebugString("WriteFile failed!\n");
            return 0;
        }
    
            //Write the BITMAPINFOHEADER
        bytes_write=sizeof(BITMAPINFOHEADER);
        if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL))
        {
            OutputDebugString("WriteFile failed!\n");
            return 0;
        }
    
            //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");
            return 0;
        }
    
        CloseHandle(fileHandle);
    
        DeleteObject(SelectObject(hdc2,OldObj));
        DeleteDC(hdc2);
    
        return 1;
    }
    

    meine frage ist jetzt, ob ich den Screenshot irgendwie mit send() versenden kann, ohne ihn vorher zwischenzuspeichern (die .bmp zu erstellen)
    kann ich da irgendwie bitblt auf eine BITMAP variable machen und diese dann verschicken oder wie geht das? Wäre sehr dankbar für hilfe


  • Mod

    aBmp ist doch die Bimtap in Deinem Speicher! Du kommst nun auch an alle Daten der Bitmap!
    Was möchtst Du jetzt?



  • das problem ist, dass ich das bild zuerst mit cximage in ein jpg umwandeln muss jedoch auch im speicher.

    // Converten für geringere Dateigröße
    	CxImage  image;
    	// bmp -> jpg
    	image.Load(szScreenName, CXIMAGE_FORMAT_BMP);
    	if (image.IsValid()){
    		if(!image.IsGrayScale()) image.IncreaseBpp(24);
    			image.SetJpegQuality(50);
    		image.Save("tmp.jpg",CXIMAGE_FORMAT_JPG);
    	}
    	return 0;
    

    leider wird dabei das bild auch abgespeichert und wird geladen von datei


Anmelden zum Antworten