Lösungsvorschläge | Client-Server | Desktop übertragen



  • @Jochen Kalmbach
    nene die alten zeiten hab ich abgelegt... hoffe ich^^

    also ich arbeitete mich gerade auch erst ein wenig ein - hab mit
    CreateDIBSection() noch net gearbeitet.
    aber ich kann nun so auf die pixel zugreifen:

    for(int i = 0; i < height_s * width_s * 3; i += 3)
    {
    // R G B
    printf("%i_%i_%i ", dibvalues[i+2], dibvalues[i+1], dibvalues[i]);
    }

    meint ihr das so? das ich hier die farben der pixel vergleiche und nur
    die veränderten sende?

    danke euch aber schonmal 🙂 !



  • babelduo schrieb:

    for(int i = 0; i < height_s * width_s * 3; i += 3)
    {
    // R G B
    printf("%i_%i_%i ", dibvalues[i+2], dibvalues[i+1], dibvalues[i]);
    }

    ja, so ähnlich. du musst 'dibvalues', der ja ein void* ist, für so'ne schleife in den richtigen typ umwandeln. bei 24 und 32 bits/pixel muss es ein DWORD sein und bei 16bits/pixel ein WORD.

    babelduo schrieb:

    meint ihr das so? das ich hier die farben der pixel vergleiche und nur
    die veränderten sende?

    naja, das vergleichen und senden ist ein anderes thema. man kann z.b. den screen in kleine, rechteckige bereiche 'kacheln'. wenn man eine änderung festgestellt hat, schickt man die entsprechende 'kachel'. kacheln mit gleichem inhalt (z.b. einfarbiger desktophintergrund) braucht man nur einmal zu schicken und danach nur deren 'kachelnummer' und position.
    vielleicht schauste dir mal an, wie vnc sowas macht:
    http://grox.net/doc/apps/vnc/howitworks.html



  • ja ok!
    also das mit dem nachschauen und nur dem verändertem senden kann ich ja
    dann machen da schaue ich mal...

    aber wie genau ist das mit dem umwandeln gemeint?

    WORD* test;
    test=(WORD*)dibvalues;
    
    for(int i = 0; i < height_s * width_s * 3; i += 3)
    {
    
    	printf("%i_%i_%i ", test[i+2], test[i+1], test[i]);
    }
    

    ?

    da kommen dann farbwerte raus die so ausschauen:

    31875_39312_65535
    0_812_0
    87_46_116
    454_47482_43851
    

    naja und wenn ich den ganzen desktop (bei mir 1280x1024) nehme
    sürtzt mein programm ab wegen eines laufzeitfehlers!

    wenn ich mittels StretchBlt(...) auf 100x100 "schrumpfe"
    läuft er wenigstens ohne laufzeitfehler durch 😉

    ich nehme an das liegt an der pointer-konvertierung?



  • babelduo (net eingeloggt) schrieb:

    WORD* test;
    test=(WORD*)dibvalues;
    
    for(int i = 0; i < height_s * width_s * 3; i += 3)
    {
    
    	printf("%i_%i_%i ", test[i+2], test[i+1], test[i]);
    }
    

    nee, das wär' ja für 48 bits/px 😉
    für 16 bits sieht das ungefähr so aus:

    for (i=0; i<height*width; i++)
    {
       WORD *w = (WORD*)dibvalues + i;
       red = *w & 0x1f;
       green = (*w>>5) & 0x1f;
       blue = (*w>>10) & 0x1f;
    }
    

    kann sein dass rot und blau vertauscht sind (ist ja nur ein beispiel)...



  • achso 🙂
    ja danke... habs nun so ausprobiert:

    for (int i=0; i<height*width; i++)
    {
    	WORD *w = (WORD*)dibvalues + i;
    
    	/*red = *w & 0x1f;
    	green = (*w>>5) & 0x1f;
    	blue = (*w>>10) & 0x1f;*/
    
    	printf("%i_%i_%i ", *w & 0x1f, (*w>>5) & 0x1f, (*w>>10) & 0x1f);
    }
    

    raus kommen allerdings auch komische farbwerte!!

    21_21_21
    22_22_22
    23_23_23
    ...
    

    🙂



  • babelduo (net eingeloggt) schrieb:

    raus kommen allerdings auch komische farbwerte!!

    21_21_21
    22_22_22
    23_23_23
    ...
    

    kann doch sein. vielleicht irgendwelche grautöne.
    aber vielleicht sind in meinem code auch fehler (operatorreihenfolge oder sowas).
    das prinzip sollte jedoch klar sein: jeweils 5 bits pro farbe, alle 3 in ein WORD gequetscht...



  • so - ich war nun längere zeit nicht mehr aktiv wegen urlaub und so 😉

    habe mir nun eine testView-MFC-Anwendung geschrieben die einen Screenshot
    macht und ihn Pixel für Pixel ausgibt...

    das problem: das Bild hat nen komischen Farb-Stich 😉
    url: http://img87.imageshack.us/img87/7452/untitledlm0.jpg

    hier mein code:

    das bild wird auf 800x600 geschrumpft...

    HDC hdc, hdc2;
    		int width,height;
    
    		width=800;
    		height=600;
    
    		hdc=::GetDC(NULL); 
    
    		HBITMAP aBmp; 
    		BITMAPINFO bi; 
    		HGDIOBJ OldObj; 
    		void *dibvalues; 
    
    		BITMAPINFOHEADER bmih; 
    
    		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; 
    
    		bi.bmiHeader=bmih; 
    
    		aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL); 
    
    		if (aBmp==NULL) 
    		{ 
    			//OutputDebugString("CreateDIBSection failed!\n"); 
    		} 
    
    		OldObj=SelectObject(hdc2,aBmp);
    
    		StretchBlt(hdc2,0,0,width,height,hdc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),SRCCOPY);
    
    		// Screenshot ausgeben
    		CDC* DC;
    		DC=GetDC();
    
    		int x=0;
    		int y=height;
    
    		int red,green,blue;
    
    		for (int i=0; i<height*width; i++)
    		{
    			WORD *w = (WORD*)dibvalues + i;
    
    			red = *w & 0x1f;
    			green = (*w>>5) & 0x1f;
    			blue = (*w>>10) & 0x1;
    
    			DC->SetPixel(x,y,RGB(red,green,blue));
    
    			x++;
    
    			if(x==width)
    			{
    				x=0;
    				y--;
    			}
    		}
    

    woran liegt das? ansonsten klappt ja alles perfekt und ich kann
    weiterarbeiten 🙂

    danke schonmal!



  • Hi babelduo,

    hast du die Möglichkeit den Code mal online zu stellen, bzw. komplett zu posten?

    Mal sehen was sich da noch drehen lässt, interessiert mich das Thema.

    lg
    Dibmen



  • Hast du schon eine lösung für dein Problem mit den Farbwerten gefunden?



  • hola

    mal so ein gedanke:
    wie waere es wenn man alle pixel des letzten bildes mit dem aktuellen subdrahieren wuerde ? nicht veraenderte sektionen wuerden dann '0' sein. bei wenig aenderungen koennte man dann bestimmt mit ner RLE oder so ne gute kompression bekommen und man koennte den algo auch recht gut parallelisieren. muesste von der geschwindigkeit her um einiges besser sein. was meint ihr dazu ?

    Meep Meep



  • Das ändert nicht an der Tatsache, dass momentan die Farbwerte total durcheinander sind 😢

    Aber grundsätzlich...



  • @Meep Meep
    ja danke schonmal! darüber muss ich mir nun auch gedanken machen 🙂

    ich habe hier mein projekt mal hochgestellt... vllt. findet ihr ja den
    fehler mit den farbwerten - wär cool!

    http://www.babelduo.de/screen.rar
    (MFC-Anwendung Visual C++)

    danke schonmal 🙂

    p.s: wenn man Enter drückt gehts los... 😉



  • DC->SetPixel (x,y, (red<<16 | green<<8 | blue)<<3);
    

    😉



  • Er hat damit aber noch immer einen Farbstich im Bild.

    Hast du denn das Senden via Winsock schon hinbekommen?



  • Naja, zum Ausgeben solltest du das richtig hochskalieren.
    Also (r << 19) + (g << 10) + (b << 3) wenn r, g, b in 16 bit 5-6-5 vorliegen.



  • Vielleicht bin ich einfach zu doof, aber ich fummel mir dabei einen ab
    und erhalte, wie auch immer ich es anstelle, immer einen heftigen Farbstich
    im Bild.



  • Bei mir seh ich auch nur ein lustig eingefärbtes Bild,...aber wems reicht 😃



  • Was sagt der Threadersteller dazu? Gelöst?



  • blue = (*w) & 0x1f;
    			green = ((*w)>>5) & 0x1f;
    			red = ((*w)>>10) & 0x1f;
    
    			DC->SetPixel(x,y,RGB((red * 8), (green * 8), (blue * 8)));
    

    So, das funktioniert.
    Das 16 Bit Format wo Windows verwendet wenn man bloss BI_RGB angibt ist halt RGB555. Natürlich muss das dann noch Faktor 8 hochskaliert werden...

    Noch besser ist das, damit Weiss Weiss bleibt und nicht Grau wird:

    DC->SetPixel(x,y,RGB((red << 3) + (red >> 2), (green << 3) + (green >> 2), (blue << 3) + (blue >> 2)));
    


  • hustbaer schrieb:

    blue = (*w) & 0x1f;
    			green = ((*w)>>5) & 0x1f;
    			red = ((*w)>>10) & 0x1f;
    
    			DC->SetPixel(x,y,RGB((red * 8), (green * 8), (blue * 8)));
    

    [/cpp]

    Ich möchte ja nicht aufdringlich sein, aber das entspricht genau meinem Vorschlag sechs Beiträge darüber 😉

    PS: Eine unterschiedliche Gewichtung der Farbkomponenten ist IMHO nur für LC-Displays nötig.


Anmelden zum Antworten