2012-04-05 12 views
8

Ho scritto un programma di mappatura in Delphi in cui l'utente può caricare un'immagine raster in background che memorizzo in memoria. In un caso l'utente ha caricato con successo un BMP da 44MB, ma il programma era lento e quando hanno stampato (aggiungo l'output) hanno ottenuto un errore Out Of Resources. Ho convertito il BMP in PNG (3 MB) e il programma ha prestazioni migliori e il lavoro di stampa è andato a buon fine.Efficienza nell'utilizzo di PNG vs BMP con file di grandi dimensioni

Poiché il PNG deve essere espanso su un DIB della stessa dimensione, tuttavia, perché esiste una differenza di prestazioni/risorse? Se necessario, occorre più lavoro e allocazioni di memoria per caricare il PNG. Cosa mi manca?

Dal momento che non sembrano esserci risposte ovvie, scriverò un piccolo progetto dimostrativo in modo da poter effettuare ulteriori ricerche.

+3

Sei positivi i file BMP e PNG hanno lo stesso numero di pixel e BitsPerPixel? –

+0

Che cosa stai utilizzando per stampare l'immagine? Stai scrivendo direttamente su Printer.Canvas o stai utilizzando un componente in un report come QuickReport o Rave? – rkawano

+0

Francois: Sì, ho preso il file dei clienti e l'ho provato personalmente. rkawano: stampo su tessere DIB che invio alla tela della stampante. – Mitch

risposta

1

La differenza è la compressione.

BMP = dati grezzi come fa PNG = stessi dati grezzi utilizzando "perdita" compressione

Questo ha un risparmio in più di 1 modo nei circoli programmazione ...

  1. caricamento dei risultati di immagini nel caricare meno dati grezzi in ram.
  2. Si stanno quindi elaborando meno dati grezzi in modo da avere meno risorse.

rivestimenti significa che il problema per voi è esponenziale per esempio ...

44MB x 10 tessere = 440MB

Vs

3MB x 10 tessere = 30MB

Stampanti don Mi piace ricevere enormi quantità di dati e tutti gli stampatori più costosi tendono a preferire la stampa e l'intero documento in una volta sola (ad es. tampona l'intero flusso).

Così dalla tua app l'utente dice "Stampa" ... il tuo codice dice quindi "ho intenzione di mandare 10 copie di questo" e la stampante avvia "memorizzando nella cache" 440 MB di dati grezzi.

Le stampanti domestiche più comuni si affidano al PC per eseguire la memorizzazione nella cache e stampare ciò che viene fornito, ma una stampante da ufficio standard eseguirà la memorizzazione nella cache e stamperà il documento.

Tuttavia ... penso che questa sia una cosa opzionale che è possibile modificare (penso che varia da stampante a stampante).

EDIT:

Heres qualcosa dal mondo della programmazione del gioco:

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

+0

Nella traccia tramite il codice, il PNG viene espanso su un DIB di uguale dimensione sul BMP in memoria.Suppongo che più codice efficiente per la memoria farebbe la conversione, se necessario. – Mitch

+0

Stai dicendo che la piastrellatura non aiuta? Disegno una porzione sulla piastrella, alla risoluzione del dispositivo, che viene quindi passata alla stampante. Disegnerei direttamente e lasciare che il driver della stampante lo gestisse, ma poi perderei la possibilità di fare trasparenza. – Mitch

+0

Non sono del tutto sicuro di quello che stai facendo, ma il concetto di base è che ogni pezzo di quella immagine che si invia alla stampante deve elaborare e deve farlo normalmente come dati "grezzi" non compressi. Questo potrebbe essere la causa del tuo problema di risorse ... risorsa sulla stampante non sul computer ... ha senso? – War