hdc in buffer kopieren



  • hi

    ich habe einen hdc in dem die displaydaten für ein lcd stehen
    diese lese ich zur zeit mit GetPixel() aus und wenn die funktion schwarz zurückgibt setzte ich das pixel in einem puffer der dann später direkt an das lcd übertragen wird

    das problem ist nur, dass ich die funktion 160x128 = 20480 mal pro Sekunde aufrufe um die ausgabe zu aktualisieren. das ist so ziemlich die schlechteste art und weise wie man das regeln kann.

    gibt es keine möglichkeit den hdc (schwarz/weiss 1 bit) anders auszulesen? von mir aus in ein array aus 32bit ints oder nen void*
    hab in der msdn nix gefunden was mir zugesagt hätte. lese jetzt mal nochn bisschen in der KB nach

    ansonsten implementier ich mir meine bildschirm matrix selbst und dann halt auch die setline funktionen... aber da das die winapi ja schon unterstützt, warum das rad neu erfinden?

    schon mal thx für die antworten



  • GetDIBits ?! 😉



  • ups

    die funktion hab ich irgendwie überlesen 😉
    mal schaun ob ich das so hinbekomme

    thx 🙂



  • Bitte poste wie das mit GetDIBits funktioniert, wenn du es hinbekommen hast !



  • Das könnte ein wenig helfen, ist allerdings VB

    http://www.activevb.de/tipps/vb6tipps/tipp0493.html



  • so, ich bins mal wieder

    ich hab eben ne stunde an getdibits rumgebastelt, bin aber zu keinem ergebnis gekommen

    naja hab aber ehrlich gesagt noch nie was mit bitmaps allgemein gemacht

    ich poste hier mal den ausschnitt aus meiner lcd routine, die die daten aus dem hdc auswerten sollte

    int dctolcd(HDC hdc, int size_x, int size_y) //+weitere steuerdaten fürs lcd (unsigned char)
    {
    	HDC hdcTemp;
    	HBITMAP hBitmap;
    	HGDIOBJ hOld;
    	BITMAPINFO bmi;
    	BYTE *data;
    
    	hdcTemp = CreateCompatibleDC(hdc);
    
    	data=(BYTE*) malloc(size_x*size_y);
    	ZeroMemory(data, size_x*size_y);
    
    	ZeroMemory(&bmi, sizeof(BITMAPINFOHEADER));
    	bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    	bmi.bmiHeader.biWidth=size_x;
    	bmi.bmiHeader.biHeight=size_y;
    	bmi.bmiHeader.biPlanes=1;
    	bmi.bmiHeader.biBitCount=1;
    
    	bmi.bmiColors[0].rgbBlue=0;
    	bmi.bmiColors[0].rgbGreen=0;
    	bmi.bmiColors[0].rgbRed=0;
    	bmi.bmiColors[0].rgbReserved=0;
    
    	bmi.bmiColors[1].rgbBlue=255;
    	bmi.bmiColors[1].rgbGreen=255;
    	bmi.bmiColors[1].rgbRed=255;
    	bmi.bmiColors[1].rgbReserved=0;
    
    	hBitmap=CreateCompatibleBitmap(hdcTemp, size_x, size_y);
    	hOld=SelectObject(hdcTemp, hBitmap);
    
    	// hier zeichenoperationen auf hdcTemp, die dann später aufs display sollen
    
    	GetDIBits(hdcTemp, hBitmap, 0, size_y, (void**)&data, &bmi, DIB_RGB_COLORS);
    
    	DeleteObject(SelectObject(hdcTemp, hOld));
    	DeleteDC(hdcTemp);
    
    	return 0;
    }
    

    doch egal was ich in den dc rein schreibe, die daten im bits pointer ändern sich nicht (initialisiere ich die variable via fillmemory z.b. mit 0x55 steht nach ausführen der getdibits funktion immer noch 0x55 drin).

    hmm weiss jetzt ehrlich gesagt nicht mehr weiter 😞
    vielleicht kann mir ja jemand helfen

    schonmal thx

    BlueScreen32.dll



  • If the lpvBits parameter is a valid pointer, the first six members of the BITMAPINFOHEADER structure must be initialized to specify the size and format of the DIB. The scan lines must be aligned on a DWORD except for RLE compressed bitmaps.

    Also für biCompression noch was angeben (wohl BI_RGB) und evtl. scan lines noch ausrichten 🙄



  • hi

    ich hatte mal wieder lust, an dem kram weiterzumachen und hab den fehler gefunden.
    da andreas den code haben wollte, hier den funzenden code:

    HDC hdcTemp;
    	HBITMAP hBitmap;
    	HGDIOBJ hOld;
    	BITMAPINFO bmi;
    	BYTE* data;
    
    	hdcTemp = CreateCompatibleDC(NULL);
    
    	data=(BYTE*) malloc((int)((size_x*size_y)/8)); //geht halt nur wenn displayauflösung%8=0, ansonsten müsste man bisschen rechnen
    	ZeroMemory(&bmi, sizeof(BITMAPINFOHEADER));
    
    	bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    	bmi.bmiHeader.biWidth=size_x;
    	bmi.bmiHeader.biHeight=-size_y;
    	bmi.bmiHeader.biPlanes=1;
    	bmi.bmiHeader.biBitCount=1;
    	bmi.bmiHeader.biCompression=BI_RGB;
    
    	bmi.bmiColors[0].rgbBlue=0;
    	bmi.bmiColors[0].rgbGreen=0;
    	bmi.bmiColors[0].rgbRed=0;
    	bmi.bmiColors[0].rgbReserved=0;
    
    	bmi.bmiColors[1].rgbBlue=255;
    	bmi.bmiColors[1].rgbGreen=255;
    	bmi.bmiColors[1].rgbRed=255;
    	bmi.bmiColors[1].rgbReserved=0;
    
    	hBitmap=CreateCompatibleBitmap(hdcTemp, size_x, size_y);
    	hOld=SelectObject(hdcTemp, hBitmap);
    
    	//hier in den hdcTemp reinzeichnen, z.b. so:
    	SetPixel(hdcTemp, 0, 0, RGB(255, 255, 255));
    	SetPixel(hdcTemp, 0, 1, RGB(255, 255, 255));
    	SetPixel(hdcTemp, 159, 127, RGB(255, 255, 255));
    
    	hBitmap=(HBITMAP)SelectObject(hdcTemp, hOld);  //Bitmap darf nicht in den dc selected sein, sonst geht es nicht!
    
    	GetDIBits(hdcTemp, hBitmap, 0, 160, data, &bmi, DIB_RGB_COLORS);
    
    	free(data);
    	DeleteObject(hBitmap);
    	DeleteDC(hdcTemp);
    

    die getdibits routine hat ne ausführzeit von 0,000027657146369161443703040470227361 s

    macht man die 20560 (glaub ich mal) calls an GetPixel, dann dauerts 0,0055096387948747676031450924628689 s
    diese daten müsste man dann noch in das array schieben und das dauert auch nochmal seine zeit... das macht dann nen geschwindigkeitzuwachs im bereich >200 fach

    zum vergleich:
    0,000027657146369161443703040470227361 s
    0,0055096387948747676031450924628689 s

    ok das wars dann von mir
    danke für die tips

    bye

    BlueScreen32.dll



  • sry

    nur ein test
    diesmal eingeloggt



  • Hi,

    Sorry erst fuer mein Deutsch. Ich bin aus Polen. Ich habe ein Problem. Wenn ich die GetDIBits bei dem 256-Farbe Bild verwende, wird meine Farbpalette in BITMAPINFOHEADER geaendert und auch die Bilddaten. Wenn ich die Pixels mit der GetPixel routine von hDC nach DIB kopiere ist alles OK. Was ist los? Kann mir jemand helfen?

    Heniek



  • Ich verstehe dein Problem offenbar nicht so ganz, aber die BITMAPINFOHEADER-Struktur und die Bilddaten werden ja eingelesen - logisch, dass die sich ändern 🙄

    Zeige evtl. mal ein bisschen Code und sage genau, wo es nicht so läuft, wie gewünscht



  • Hi,

    Meine Idee ist folgende:
    In eine Bitmap einen Text einzufuegen.

    Mache ich also:

    // die hBitmap erzeugen
    hBitmap = CreateDIBitmap(hdc, ...

    // Memory Context erzeugen
    hMemDC = CreateCompatibleDC(hdc);

    ... hier fuege ich einen Text mit der DrawText ein ...

    // und jetzt will ich ganz einfach das Inhalt des Memory context wieder in DIB kopieren. Wenn ich jedes Pixel mit der GetPixel aus dem Speicher ausnehme und in die Bild-Daten kopiere, ist alles in Ordnung - kopiere ich dann nur die Bild-Daten. Wenn ich jedoch die ganze Speicher (hMemDC) mit der GetDIBits in eine DIB kopieren will, dann wird die Farbpalette und die Bild-Daten komisch geaendert.

    res = GetDIBits(hMemDC, hBitmap, 0, myBH->biHeight, myImage, (LPBITMAPINFO) myBH, DIB_RGB_COLORS);

    ???

    Heniek



  • Wenn du eine Palette hast, warum nimmst du dann DIB_RGB_COLORS und nicht DIB_PAL_COLORS - vielleicht hilft das ja schon 🙂



  • Leider hilft es nicht. DIB_RGB_COLORS oder DIB_PAL_COLORS beschrift nur die Weise, wie die Farbpalette in BITMAPINFO dargestellt wird. 😞



  • Sehe es jetzt erst: 🙄

    If the requested format for the DIB matches its internal format, the RGB values for the bitmap are copied. If the requested format doesn't match the internal format, a color table is synthesized.



  • könntest du mal noch ein bisschen mehr code posten?

    das bitmap darf nicht in einen dc selected sein, wenn du getdibits aufrufst, sonst bekommst du keine ausgabe in den puffer

    bye



  • Ja, schoen, aber was es eigentlich bedeutet? Wie seht es in Praxis aus?
    🙄



  • Hi,

    Mache ich ganz einfach so:

    In myImage befinden sich meine Bilddaten und in myBH ist BITMAPINFO mit Farbtabelle.

    HBITMAP bmp = CreateDIBitmap(hDC, myBH, CBM_INIT, myImage, (LPBITMAPINFO) myBH, DIB_RGB_COLORS);
    HDC mem = CreateCompatibleDC(hDC);

    HBITMAP oldBmp = (HBITMAP) SelectObject(mem, bmp);

    res = GetDIBits(mem, hBitmap, 0, myBH->biHeight, myImage, (LPBITMAPINFO) myBH, DIB_RGB_COLORS);

    Mit dieser Code normalerweise soll ich wieder nich geaendertes Bitmap bekommen. Die in myBH definierte Farbtabelle indexe sollen nich geaendert werden. Nach diese Operation bekomme ich jedoch eine andere Farbtabelle und eine andere Bilddaten (in my Image). Ich weiss es nicht, ob Du mich gut verstanden hast, versuch mal vielleicht es selbst zu testen.

    MFG
    Heniek



  • Wozu machst du das mit CreateCompatibleDC(hDC)? Wenn du eh schon in hDC in Handle hast kannst du doch auch gleich dieses verwenden 🙄



  • Hi,

    Leider hab ich noch nicht mein Problem ausgeloest. Es geht darum, dass die Funktion GetDibits ersetzt die Farbtabelle auf eine Systemtabelle und passt dafuer die Bilddaten. Ich will aber so nicht. Ich moechte die Farbtabelle so lassen, wie ich sie frueher festgestellt hab und die Bilddaten nicht aendern.
    Was mach ueberhaupt die Funktion GetDIBits. Die kopiert nicht genau die Pixel aus hMemory (HDC) nach ein Puffer (bei mir). Was ist los? 😞


Anmelden zum Antworten