¡Increíble velocidad de decodificación de GDI + y terrible velocidad de extracción!

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

  •  06-07-2019
  •  | 
  •  

Pregunta


Gracias por las respuestas & # 65292; En realidad, no estoy desconcertado sobre dibujar 1024 * 768 píxeles es más lento que 100 * 100 píxeles ... Es una lógica tan simple ... Lo que me dejó perplejo es que el algoritmo de interpolación de DrawImage puede ser muy lento, mientras que existe un algoritmo mucho mejor, y su decodificador parece que puede decodificar desde un jpg con una cierta resolución, es realmente genial, busco alguna vez pero no encuentro ninguno lib libre para hacer esto ...

¡Es realmente extraño! Agrego el siguiente código en el método Paint. c: \ 1.jpg es un archivo jpg de 5M, aproximadamente 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);

¡Lo anterior es realmente rápido! incluso en tiempo real! ¡No creo que decodificar un JPG de 5 m pueda ser tan rápido!

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

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);

El código anterior se vuelve realmente lento

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

Si agrego Bitmap = Bitmap :: FromFile (L " c: \ 1.jpg " ;, true); // en construcción

dejar

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

en el método OnPaint, El código sigue siendo un poco lento ~~~

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

En comparación con la decodificación, el proceso drawImage es realmente lento ...

¿Por qué y cómo hicieron eso? ¿Pagó Microsoft a los hombres que se hicieron cargo del decodificador el doble salario que a los hombres que se encargaron de escribir drawingImage?

¿Fue útil?

Solución

No es necesario decodificar JPG si está reduciendo la escala en un factor de 8. Las imágenes JPG consisten en bloques de 8 por 8 píxeles, transformados por DCT. El valor promedio de este bloque es el coeficiente 0,0 del DCT. Entonces, reducir un factor de 8 es simplemente una cuestión de tirar todos los demás componentes. Reducir aún más (por ejemplo, 4000- > 200) es solo cuestión de reducir de 4000 a 500, y luego reducir normalmente de 500 a 200 píxeles.

Otros consejos

Entonces, lo que realmente te estás preguntando es por qué

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

es más rápido que

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

¿Correcto?

Bueno, el hecho de que esté dibujando 100 veces más píxeles en el segundo caso podría tener algo que ver con eso.

Podría ser posible que la decodificación se difiera hasta que se necesite. Por eso es tan rápido.

Quizás en el caso 200x200 GDI + solo decodifica suficientes bloques para pintar 200x200 y en 2000x2000 decodifican más.

Las rutinas gráficas siempre contienen algunas optimizaciones oscuras, nunca se podría saber.

Quizás Reflector le dirá?

Solo una suposición, pero ¿podrías intentar dibujar con 4000x3000 o 2000x1500? Quizás el hecho de que 4000 y 3000 sean divisibles por 200 está acelerando el conjunto y que 3000 no sea divisible por 200 lo ralentiza (aunque esto realmente sería extraño).

En general, realice algunos perfiles o mediciones de tiempo. Si 2000x2000 es aproximadamente 100 veces más lento que 200x200, todo está bien. Y no se moleste si 2000x2000 es demasiado lento. Si su pantalla está a 1024x768, no puede ver la imagen completa, por lo que es mejor elegir la parte de la imagen que está visible en la pantalla y dibujarla, 1024x768 es 5 veces más rápido que 2000x2000.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top