bitmaps schicken



  • Natürlich gibt es sowas - JPEG zum Beispiel - kommt eben darauf an, was das im Endeffekt geben soll 😉



  • Auflösung: 1024x768 = 786432
    Speicher pro Pixel: 3 Bytes
    Macht insgesamt: 2359296 Bytes = 2304 KB = 2.25 MB

    Das brauchst du mindestens!



  • Oder auch zum Beispiel mit PNG wird es relativ klein (Ich hab gerade mal ein Screenshot gemacht - kommt auf 40 KB) und sieht dabei noch genauso gut aus 🙂



  • komisch bei mir is der desktop nur 1.50mb groß



  • und wie machs ich mit winapi und png???



  • flenders schrieb:

    Oder auch zum Beispiel mit PNG wird es relativ klein (Ich hab gerade mal ein Screenshot gemacht - kommt auf 40 KB) und sieht dabei noch genauso gut aus 🙂

    Dann muss man wohl trotzdem erstens den ScreenShot per Bitmap machen (was schon einige Zeit kostet) und dann auch noch konvertieren (1. keine Ahnung, wie das geht, und 2. kostet das auch Zeit).



  • gargamel schrieb:

    komisch bei mir is der desktop nur 1.50mb groß

    Hast du vielleicht ne andere Auflösung als 1024 x 768? Oder eine andere Farbauflösung? Meiner ist so groß!



  • also ich hab als farbtiefe 16 und des sieht immer noch gut aus
    aber bei ner farbtiefe von 8 siehts erst lustig aus *gg*



  • aber wie kann ichs jetzt denn mit einem socket verschicken?????



  • Mit was für einer Farbtiefe speicherst du das Bitmap? Bei mir gibts da keine 16 Bit. Nur 24 Bit, 256 Farben (8 Bit) und drunter...
    Aber du hast recht, die Farbeinstellungen für das Desktop sehen mit 16 Bit immernoch OK aus.



  • LRESULT MENUFIVE(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=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,0,0); 
    
        if (aBmp==0) 
        { 
            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; 
    }
    

    habs damit gemacht is des aus dem faq

    aber wie kann ich des jetzt verschicken die socket verbindung hab ich schon alles gemacht jetzt muss ich nur noch wissen wie man des file verschickt 😮 😮



  • gargamel schrieb:

    habs damit gemacht is des aus dem faq

    aber wie kann ich des jetzt verschicken die socket verbindung hab ich schon alles gemacht jetzt muss ich nur noch wissen wie man des file verschickt 😮 😮

    Ja, genau das hatte ich doch schon gepostet!!! Das hättest du hier nicht wirklich nochmal aufführen müssen.
    Und das Schicken geht doch genauso. Nur, dass du send() anstatt WriteFile() benutzt. Liest du dir fremde Codes denn nicht durch, wenn du sie benutzt???



  • aber wieso gehen dann bei der keine 16bit



  • irgentwie geht des mit dem senden bei mir nich kansch du mir bitte zeigen wie des geht des klappt bei mir einfach nich 😞 😞 😞 😞



  • Hallo Leute !
    ich muss als Abschlussprojekt eine RemoteControlling Software schreiben. Muss also den Bildschirmabdruck über die Leitung schicken, auf der Gegenseite empfangen, und anzeigen. Bevor ich anfangen kann, muss ich einiges klären, und vielleicht könnt ihr mir helfen. Und zwar sollen folgende Vorraussetzungen für meinen Anwendungfall erfüllt sein:
    1. Auflösung 1024 x 768
    2. Bildschirmabdruck ca. 5 mal pro sec verschicken (auf der Gegenseite also entgegennehmen und zur Anzeige bringen)
    3. Das Komprimierungsverfahren muss freeware sein.

    Nun die Fragen, die ich habe:

    1. Welches Komprimierungsverfahren kommt hier in Frage ?
    2. Wie verschicke ich die Bilder, in welcher Form ? Was ich meine ist, muss das eine Datei sein, die ich über TCP/IP verschicke ? Oder gibt es spezielle Klassen dafür ? Könnte mir z.B. ne Art Buffer vorstellen, so, wie man eben Textdateien verschickt.

    Ich danke Euch schon mal im Voraus, hoffe ihr könnt mir helfen



  • Komprimier die Bilder via jpeg und sende immer nur Bildteile die sich geändert haben, dass bringt besonders bei nem Desktop nen enormen Speed-Vorteil!



  • Und woher weiß man, was sich geändert hat???



  • Das letzte Bild im Speicher behalten und mit dem aktuellen vergleichen ?



  • Ist das nicht etwas zu viel Aufwand bei 1024 x 768 = 786432 Pixeln?



  • Hmm... also diese Frage interessiert mich auch. Ich würde aber sagen Graka(Wie WebFritzi so schön schrieb) anzapfen kommt besser als das mit einzelnen Bildern zu machen. Nur wie?...


Anmelden zum Antworten