Mittels GDI Bitmap schnell aanzeigen bzw. schnelles SetPixel?
-
Hallo,
ich entwickle gerade ein Programm was unter anderem Tiff dateien auf einem Windows CE anzeigen soll. Das klappt soweit im Moment auch alles ganz gut, nur ist das Anzeigen der Bildinformationen (also der Farbe an einem bestimten Pixel noch sehr langsam).
Ich hab schon vieles Probier, nur kenn ich mich in C++ bzw. GDI nicht in dem Maße aus wie es scheinbar dafür nötig ist
Der dafür relevante Code-Teil ist denke ich der:
Ich lasse mit von einer Bibliothek ein Array füllen (und zwar mit Bytes für ein indiziertes Tiff-Bild). Danach geh ich das Bild durch und hole mir für jedes Byte da drin die Farbe aus der Farbtabelle und speichere das in einer Variable vom Typ "GDALColorEntry" (c1, c2, c3, c4 (c4 benötige ich nicht) sind die Farbkomponenten RGBA als Short).
Dann mach ich eben ein SetPixel mit der Farbe und der Position.for(int i=0; i<width;i++) { for (int j=0; j<height; j++) { const GDALColorEntry * entry = ct->GetColorEntry(pafScanline[i+j*width]); SetPixel(hDC2, i, j, RGB(entry->c1,entry->c2,entry->c3)); } }Gibt es da noch einen Trick das Schneller zu machen?
Ich habe schon DubbleBuffering versucht und nutze es auch, aber so richtig schneller ist das glaube nicht. Das mache ich jedenfalls wie folgt:Am Anfang:
HDC hDC2 = CreateCompatibleDC(hDC); HBITMAP hBM = CreateCompatibleBitmap(hDC, width, height);Danach kommt nach dem Array-Füllen-Lassen und dem Teil oben dann folgende:
BitBlt(hDC, 0, 0, width, height, hDC2, 0, 0, SRCCOPY); DeleteObject(hBM); DeleteDC(hDC2);Das klappt auch ganz gut - das Bild taucht auf einmal auf.
Habt ihr eine Idee was ich da noch machen könnte?
Danke
Tom
-
Ähnlich wie die Library mit scanlines arbeitet, solltest du es auch tun.
Dazu gibt es den Befehl SetDIBits().
Evtl. kannst du sogar die scanlines direkt kopieren...