bitmaps schicken
-
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?...
-
geeky schrieb:
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!
Verstehe ich das richtig, dass die Bilder verglichen werden sollen und wenn Sie nicht übereinstimmen, dann gesendet werden ? Oder muss ich nur Teile senden ? Wie soll das denn gehen ?
Und meine zweite Frage war ja, wie versende ich die ? Muss ich dann mit DIBs arbeiten ? Oder wie ?
-
Da ist noch etwas, die Auflösung die ich verwenden werde ist 640 x 480 bei 8 Bit Farbtiefe (ist ein Industrie-PC)
-
Man muss das doch auch anders lösen können. Sonst ergibt das nie ein flüssiges Bild.(Und das ist möglich. Ich hab sowas schon mal gesehen) Man müsste die Daten von der Grafikkarte irgendwie gleich verschicken. Nochmal msdn durchwühlen...
-
Schau dir mal RealVNC an, da bekommst du sogar den Source-Code

-
Sieht nett aus. Es ist gerade kein Compiler in Reichweite, aber ich werd's mir heute abend mal reinziehen!
-
Naja, habe eigentlich gehofft, hier ein paar nütliche Infos zu erhalten. Mein Ziel ist ja nicht, Quellcode zu finden, sondern zu erfahren, mit welchen Klassen, Techniken, unw. man arbeiten muss. Denn wie oben schon gesagt, das ist mein Abschlussprojekt (FIAE), und da möchte ich schon selber Hand anlegen, und nicht Quellcode von anderen benutzen.
-
Dann musst du dir eben mit den Infos, die du bekommen hast, selber Gedanken machen und mal in der MSDN nachschlagen

Eigentlich musst du dir eben nur ein Format ausdenken, das beide Seiten verstehen. Und um die Übertragung flüssiger zu gestalten schickst du eben evtl. nicht immer alles, sondern z.B. nur den Bereich, des aktiven Fensters oder eben die Änderungen und komprimierst die Daten
-
Hallo felnders,
ich bin natürlich für alle Infos, die ich hier erhalten habe, sehr dankbar
Mein Problem ist folgedes: ich muss ja das Projekt planen, und darum mir Gedanken machen, 1. wie ich komprimiere, um den Durchsatz (5 x / sec) bei der gegebenen Auflösung erreichen zu können, und 2. wie ich die Daten sende, auf welche Weise, ob ich da DIB-Objekte verschicke, oder ob ich das mit Buffer mache, oder sonst wie. Habe halt noch nie Bilddateien über Ethernet übertragen. Das Komprimieren und Verschicken der Bilder (Industrie-PC) wird nicht von mir realisiert, sondern von meinen Ausbildern. Ich nehme die Daten entgegen, und zeige diese an (PC).
Ich muss meinen Ausbildern aber sagen, in welcher Form (DIBs, Buffer, oder was auch immer) ich die Daten haben will. Da ich keine Erfahrung damit habe, und meine Durchführungszeit begrenzt ist, möchte ich von Befinn an den richtigen Weg nehmen, damit ich nicht mitten in der Projektdurchführung feststelle, dass das so, wie ich mir das vorgestellt habe, nicht funktioniert.In der MSDN kann ich natürlich auch nachgucken, aber wonach soll ich denn suchen ???