GDI + ‚s erstaunliche Dekodierungsgeschwindigkeit und schreckliche Ziehgeschwindigkeit!

StackOverflow https://stackoverflow.com/questions/271428

  •  06-07-2019
  •  | 
  •  

Frage


Vielen Dank für die Antworten, Eigentlich bin ich nicht verwundert über zeichnen 1024 * 768 Pixel sind langsamer als 100 * 100 Pixel ... Es ist so einfach, eine Logik .. Das machte mich verwirrt ist, dass DrawImage der Interpolations-Algorithmus sehr langsam sein kann, während es viele besseren Algorithmus existiert, und seine Decoder scheinen von einem jpg mit einer bestimmten Auflösung entschlüsseln kann, ist es wirklich cool ist, ich für einige Zeit suchen, aber nicht finden, jeden kostenlos lib, dies zu tun ...

Es ist wirklich seltsam! Ich füge den folgenden Code in auf Paint-Methode. c: \ 1.jpg ist 5M jpg-Datei, ca. 4000 * 3000

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,200,200);

Das oben ist wirklich schnell! sogar in Echtzeit! Ich glaube nicht dekodieren ein 5m JPG so schnell sein kann!

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,2000,2000);

Die werden über Code wirklich langsam

// --------------------------------------------- -----------------

Wenn ich hinzufügen, Bitmap = Bitmap :: Fromfile (L "c: \ 1.jpg", true); // in Konstrukt

Urlaub

    Graphics graphics(hdc);
    graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
    graphics.DrawImage(bitmap,0,0,2000,2000);

in OnPaint-Methode, Der Code ist immer noch ein bisschen langsam ~~~

// --------------------------------------------- ---------------------

Beim Vergleich mit der Decodierung des drawImage Prozess ist sehr langsam ...

Warum und wie haben sie das gemacht? Hat Microsoft die Männer zahlen Ladung des Decoders doppeltes Gehalt als die Männer, die Ladung des Schreibens DrawingImage nehmen?

War es hilfreich?

Lösung

Sie brauchen nicht JPGs zu entschlüsseln, wenn Sie mit einem Faktor von 8. JPG-Bilder von Blöcken von 8 × 8 Pixeln bestehen sind Verkleinerung, DCT-transformiert. Der Mittelwert dieses Blocks ist die 0,0-Koeffizienten des DCT. Also, ein Faktor von 8 nach unten Skalierung ist nur eine Frage der zu werfen alle anderen Komponenten entfernt. Scaling noch weiter nach unten (zB 4000-> 200) ist nur eine Frage der Verkleinerung 4000-500, und dann Skalierung normalerweise 500 bis 200 Pixel.

Andere Tipps

Also, was Sie wirklich fragen, warum ist

graphics.DrawImage(bitmap,0,0,200,200);

ist schneller als

graphics.DrawImage(bitmap,0,0,2000,2000);

Richtig?

Nun, die Tatsache, dass Sie 100-mal mehr Pixel im zweiten Fall zeichnen könnte etwas damit zu tun haben.

Es könnte möglich sein, dass die Decodierung, bis sie benötigt verzögert wird. Deshalb ist es so schnell ist.

Vielleicht auf dem 200x200 Fall GDI + decodiert nur genug Blöcke 200x200 zu malen und auf 2000x2000 sie dekodiert mehr.

Grafik-Routinen enthält immer einige obskure Optimierungen, man konnte nie wissen.

Vielleicht Reflector wird Ihnen sagen?

Nur eine Vermutung, aber Sie könnten versuchen, mit 4000x3000 oder 2000x1500 Zeichnung? Vielleicht ist die Tatsache, dass 4000 und 3000 teilbar sind durch 200 ist die ganze Beschleunigung und 3000 nicht teilbar durch 200 es verlangsamt (obwohl dies wäre wirklich komisch).

Im Allgemeinen, einige der Profilierung oder Zeitmessung. Wenn 2000x2000 etwa 100-mal langsamer als 200x200 ist, ist alles in Ordnung. Und nicht die Mühe, wenn 2000x2000 zu langsam ist. Wenn der Bildschirm bei 1024x768 ist, können Sie nicht das ganze Bild sehen, so dass Sie besser den Teil des Bildes auszuwählen, die auf dem Bildschirm sichtbar ist, und es zeichnen, 1024x768 5-mal schneller ist als 2000x2000.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top