Performantes Anzeigen von JPGs im Dialog möglich?
-
N'Abend zusammen,
Folgendes Problem: Ich würde gerne JPGs im Rahmen einer dialogbasierten MFC-
Anwendung anzeigen lassen (B: 32, H:32, insgesamt ca. 500 Bilder) und verwende
dazu den ausgebesserten Code von Isabeau:Ich müsste ein Gitter aus 21 * 21 Bildern anzeigen und darüberhinaus noch etvl.
einige weitere Bilder. Meine Frage dazu: Kann man das ganze irgendwie
performanter / schneller machen?
-
Du könntest erst alle Bilder laden und in ein Hintergrundbild zeichnen, bevor du dieses anzeigst, aber die Zeit zum Laden von JPEGs, die nicht zu unterschätzen ist, bleibt. Es gibt sicherlich Bibliotheken, die sehr schnell sind, aber die sind sicher nicht kostenlos.
-
Hi RenèG,
danke für deine Antwort!
Hast du denn evtl. eine Idee wo man sich zwecks solcher Bibliotheken umsehen
könnte?Gruß,
Khadgar
-
Ok,
das Problem hat sich erledigt
Wen's interessiert:
In die Header-Datei muss:
IPicture * bilderArray[100]; // Liste der verfügbaren Bilder void InitBitmaps(); // Hier werden die Bitmaps geladenIn die CPP-Datei muss:
void MyDlg::InitBitmaps() { CString pfad; LPCTSTR pBild; for (int i = 0; i < 100; i++) { pfad = meineGrafikenArray[i]; pBild = pfad; USES_CONVERSION; OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pBild)), 0, 0, 0, IID_IPicture,(void **)&m_bild); meineBilderArray[i] = m_bild; } }Diese Methode wird nun in der OnInit-Funktion aufgerufen.
Um das Bild zu zeichnen wird nun DrawImage wie folgt aufgerufen:
DrawImage(meineBilderArray[i], pX, pY, breite, hoehe);Die gesamte Arbeit die Bilder zu laden passiert nun einmal zum Programmstart
und nicht bei jedem zu zeichnenden Bild aufs neue.(In meinem Beispiel der ca. 500 Bilder ist der Bildaufbau nicht mehr bemerktbar)
-
@ Khadgar:
Hallo !
Du hast mir eine Mail geschrieben. Allerdings hat firemail kürzlich ein Update drauf gespielt und jetzt wird dort der IE 6 benötigt, ich habe aber nur den 5, kann also nicht über Mail antworten...
Zum Thema:
bei mir funktioniert das auch mit GIFs. Wenn es bei dir nicht klappt, hat das GIF evtl. eine Macke. Probier doch mal ein anderes aus. Mehr fällt mir dazu leider auch nicht ein...Tschüss
-
Hi Isabeau,
danke für deine Antwort.
Ich werde mal probieren 'andere' Gif's zu erzeugen, denn immer wenn ich der
DrawImage Funktion ein Gif übergeben schmiert die Anwendung mit einem "Pointer-
Fehler" (Anwendung XY versucht auf Speicherbereich AB zuzugreifen) ab.Kannst du mir ansonsten evtl. mal ein GIF schicken welches bei dir den
Lauf überstanden hat? Mag ja auch an meiner Konstruktion liegen
Danke,
Khadgar
-
Wie da oben schon gesagt, kann ich momentan nix verschicken. Das sollte aber auch nicht das Problem sein, weil schon beim Betriebssystem jede Menge GIFs dabei sind (such mal auf deinem Rechner nach *.gif). Ich dachte nur, das du immer nur mit einem bestimmten GIF probierst, das evtl. aus dem Internet kommt und einen Ladefehler hat.
Wie gesagt: bei mir läuft das auch mit GIFs wie in dem Beispiel beschrieben. Dein Absturz muss an etwas anderem liegen.
-
Hi Isabeau,
ich habe das jetzt mal mit folgenden Einstellungen probiert:
Gifs mit Alphatransparenz, mit Indextransparenz und ohne Transparenz in fast
allen möglichen Farben (2 bis 256) und das Ergebnis ist immer das selbe:
"Die Anweisung in XY verweist auf Speicher 0x00000000". Der Vorgang "read"
konnte nicht auf dem Speicher durchgeführt werden."Mein Sourcecode sieht wie folgt aus (ist zwar häßlich, dient aber nur um GIF's
zu testen):void CMORK_LEVELDITORDlg::TesteGifs() { CString gifs[10]; gifs[0] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_2_alpha.gif"; gifs[1] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_32_alpha.gif"; gifs[2] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_128_alpha.gif"; gifs[3] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_256_alpha.gif"; gifs[4] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_16_index.gif"; gifs[5] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_64_index.gif"; gifs[6] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_128_index.gif"; gifs[7] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_256_index.gif"; gifs[8] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_128_kein.gif"; gifs[9] = "D:\\C++\\Programme\\MORK_LEVELDITOR\\img\\gif\\gif_256_kein.gif"; IPicture * gifArray[10]; CString pfad; LPCTSTR pBild; for (int i = 0; i < 10; i++) { pfad = gifs[i]; pBild = pfad; USES_CONVERSION; OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pBild)), 0, 0, 0, IID_IPicture,(void **)&m_bild); gifArray[i] = m_bild; } ZeichneBild(gifArray[9], m_iRandObenPixel, m_iRandLinksPixel, 32, 32); }Wobei "ZeichneBild(gifArray[n]...);" in jedem Durchlauf von mir per Hand aus-
getauscht wurde.void CMORK_LEVELDITORDlg::ZeichneBild(IPicture *bild, int pX, int pY, int pBreite, int pHoehe) { CClientDC dc(this); CRect rc; GetClientRect(&rc); OLE_XSIZE_HIMETRIC width; OLE_YSIZE_HIMETRIC height; bild->get_Width(&width); bild->get_Height(&height); int x = 0, y = 0, size_x = width*96/2540, size_y = height*96/2540; bild->Render(dc, pX, pY, pBreite, pHoehe, 0, height, width, -height, &rc); }[edit] Der Vollständigkeit halber habe ich die ZeichneBild-Methode noch eben
angefügt. [/edit]
-
*vorfreudhinundherspring*
Ok. Ich habs nun auf die Reihe bekommen. Danke Euch allen, vor allem dir isabeau für deine Hinweise
