2012-04-05 13 views
8

He escrito un programa de mapeo en Delphi donde el usuario puede cargar una imagen ráster en el fondo que almaceno en la memoria. En un caso, el usuario cargó un BMP de 44 MB con éxito, pero el programa era lento y cuando imprimieron (guardo el resultado) obtuvieron un error de falta de recursos. Convertí el BMP a PNG (3MB) y el programa funciona mucho mejor y el trabajo de impresión fue exitoso.Eficiencia del uso de PNG vs. BMP con archivos grandes

Dado que PNG tiene que expandirse de todos modos a un DIB del mismo tamaño, ¿por qué hay una diferencia de rendimiento/recursos? En todo caso, debería llevar más trabajo y asignaciones de memoria para cargar el archivo PNG. ¿Qué me estoy perdiendo?

Dado que no parece haber respuestas obvias, escribiré un pequeño proyecto de demostración para que pueda investigar más sobre esto.

+3

¿Estás positiva los archivos BMP y PNG tienen el mismo número de píxeles y BitsPerPixel? –

+0

¿Qué está utilizando para imprimir la imagen? ¿Está escribiendo directamente en Printer.Canvas o está utilizando un componente en un informe como QuickReport o Rave? – rkawano

+0

Francois: Sí, obtuve el archivo de clientes y lo intenté yo mismo. rkawano: imprimo en las fichas DIB que envío al lienzo de la impresora. – Mitch

Respuesta

1

La diferencia es la compresión.

BMP = datos en bruto como se PNG = mismos datos sin procesar usando "sin pérdida" de compresión

Esto tiene un ahorro de más de 1 manera en los círculos de programación ...

  1. la carga de los resultados de imágenes al cargar menos datos sin procesar en ram.
  2. Estás procesando menos datos sin procesar por lo que necesitas menos recursos.

Forros significa que el problema para usted es exponencial, por ejemplo ...

44MB x 10 azulejos = 440MB

Vs

3 MB x 10 = 30 MB azulejos

Impresoras Don Me gusta que me entreguen grandes cantidades de datos, y a todos los impresores menos costosos les gusta imprimir todo el documento de una vez (por ejemplo, almacenar todo el flujo de datos).

De modo que desde su aplicación el usuario dice "Imprimir" ... su código dice "bien, voy a enviar 10 copias de esto" y la impresora comienza a "almacenar en caché" 440MB de datos sin formato.

Las impresoras hogareñas más comunes confían en la computadora para hacer el almacenamiento en caché e imprimir lo que se les proporciona, pero una impresora estándar de oficina hará el almacenamiento en caché y luego imprime el documento.

Sin embargo ... creo que esto es algo opcional que puede ajustar (sin embargo, creo que varía de una impresora a otra).

EDIT:

heres algo del mundo de la programación de juegos:

http://www.gamedev.net/topic/450104-png-vs-bmp/

+0

Al rastrear el código, PNG se expande a un DIB de igual tamaño que el BMP en la memoria.Supongo que un código más eficiente en memoria haría la conversión según sea necesario. – Mitch

+0

¿Estás diciendo que el mosaico no ayuda? Dibujo una parte del mosaico, en la resolución del dispositivo, que luego se pasa a la impresora. Dibujaría directamente y dejaría que el controlador de la impresora lo manejara, pero luego perdería la capacidad de transparencia. – Mitch

+0

No estoy del todo seguro de lo que está haciendo, pero el concepto básico es que cada pedazo de esa imagen que envía a la impresora debe procesar y tiene que hacer esto como datos "sin procesar" sin comprimir. Esta podría ser la causa de su problema de recursos ... recurso en la impresora que no está en la computadora ... ¿tiene sentido? – War

Cuestiones relacionadas