2010-10-14 16 views
87

Ho un'app che mostrerà un mucchio di immagini in una presentazione. Quelle immagini faranno parte del pacchetto, quindi distribuito con l'app.Quando utilizzare PNG o JPG nello sviluppo di iPhone?

Tutte le immagini sono fotografie o fotografiche, ecc

che ho letto che è preferito usare PNG come formato di immagine, ma visto che la versione JPG sarà molto più piccola, io preferirei essere utilizzando quella.

Esistono delle linee guida per il formato da utilizzare e in tal caso?

+0

volevo aggiungere che le immagini originali sono tutti in formato JPG già se questo fa alcuna differenza. – Maverick

risposta

128

I PNG sono pixel perfetti (non-lossy) e richiedono pochissima energia extra della CPU da visualizzare. Tuttavia, i file PNG di grandi dimensioni potrebbero richiedere più tempo per essere letti dallo storage rispetto a più formati di immagine compressi, e quindi essere più lenti da visualizzare.

I JPG sono più piccoli da memorizzare, ma con perdita (l'importo dipende dal livello di compressione) e per visualizzarli è necessario un algoritmo di decodifica molto più complicato. Ma la compressione tipica e la qualità dell'immagine sono generalmente sufficienti per le foto.

Uso JPG per le foto e per qualsiasi cosa grande, e PNG di per qualsiasi cosa piccola e/o progettato per essere visualizzato "Pixel Perfect" (ad esempio piccole icone) o come parte di una mascherina trasparente compositing, ecc

+48

+1. Inoltre, i PNG supportano la trasparenza, che i file JPEG non hanno. – Cameron

+1

Non ho ancora visto alcun dato sulle prestazioni di decodifica tra JPEG vs PNG e iPNG. A volte il formato più compresso è migliore a causa della riduzione degli I/O richiesti; Non sono sicuro di quanto sia veloce l'unità flash dell'iPhone. E io * sicuramente * non direi che la decompressione PNG richiede "pochissima" energia; il file Other.artwork sembra essere un dato bitmap grezzo, presumibilmente perché il sovraccarico della CPU/memoria della decompressione PNG è eccessivo per i componenti UI comunemente utilizzati. –

+2

Sul mio progetto attuale, abbiamo file png molto grandi a causa di un requisito di trasparenza. L'IO del disco supera di gran lunga il tempo impiegato per decodificare un jpeg. Tieni presente che anche i PNG vengono compressi, usando solo un algoritmo diverso. – John

1

Penso che se si desidera utilizzare trasparente, non si ha scelta eccetto PNG. Ma se il tuo background è già opaco, allora puoi usare JPG. Questa è l'unica differenza che posso vedere

+3

Questo non risolve alcuna considerazione sulle prestazioni di JPG rispetto a PNG. – daveMac

19

Apple ottimizza le immagini PNG incluse nel pacchetto dell'app iPhone. In effetti, l'iPhone utilizza una speciale codifica in cui i byte dei colori sono ottimizzati per l'hardware. XCode gestisce questa codifica speciale per te quando costruisci il tuo progetto. Quindi, si vedono ulteriori vantaggi nell'usare PNG su un iPhone diverso dalle loro considerazioni sulle dimensioni. Per questo motivo, si consiglia di utilizzare PNG per le immagini visualizzate come parte dell'interfaccia (in una vista tabella, etichette, ecc.).

Per quanto riguarda la visualizzazione di un'immagine a pieno schermo come una fotografia si può ancora trarre benefici con PNG di quanto sono non-lossy e la qualità visiva dovrebbe essere meglio di un JPG per non parlare di utilizzo delle risorse con decodifica l'immagine. Potrebbe essere necessario ridurre la qualità dei tuoi JPG per vedere un vantaggio reale nella dimensione del file, ma poi stai visualizzando immagini non ottimali.

La dimensione del file è sicuramente un fattore, ma ci sono anche altre considerazioni in gioco quando si sceglie un formato di immagine.

+5

[Nel mio benchmark] (http://imageoptim.com/tweetbot.html) L'ottimizzazione Xcode ha reso i file più lenti, probabilmente perché l'I/O del disco, non la CPU, è il collo di bottiglia. – Kornel

+1

"Apple ottimizza le immagini PNG incluse nel pacchetto dell'app iPhone" - Ciò significa che i PNG che vengono scaricati dinamicamente non sono ottimizzati? – Robert

+1

No, i PNG scaricati dinamicamente non sono ottimizzati. L'ottimizzazione è fondamentalmente solo scambiando l'ordine dei byte da RGBA a BGRA, che è ciò che il chip grafico iPhone utilizza internamente. Maggiori informazioni qui: http://graphicsoptimization.com/blog/?p=259 –

7

Ho pensato di condividere un po 'di dati sulle prestazioni di decompressione ...

Sto facendo alcune prototipazione di uno spettatore a 360 gradi - una giostra in cui l'utente può girare attraverso una serie di foto scattate da diversi angoli, per dare l'impressione di poter ruotare senza problemi un oggetto.

Ho caricato i dati di immagine in una serie di NSData per prelevare i file i/o dall'equazione, ma creare NSImage al volo. Test a una frequenza di fotogrammi quasi massima (~ 25 fps) e guardando in Strumenti vedo che l'app è chiaramente vincolata alla CPU e c'è un aumento del 10% circa del carico della CPU che mostra ~ 275 kb png contro ~ 75 kb di jpg.

Non posso dire con certezza ma il mio limite è che il limite della CPU è solo dall'esecuzione generale del programma e lo spostamento di tutti i dati in memoria, ma la decompressione dell'immagine viene eseguita sulla GPU. In ogni caso e il JPG vs.L'argomento delle prestazioni PNG sembra favorire JPG, specialmente quando vengono prese in considerazione le dimensioni dei file più piccole (e quindi le dimensioni più piccole degli oggetti nella memoria almeno in alcune parti della catena).

Naturalmente ogni situazione è diversa, non c'è alcun sostituto per le prove ...

+2

La GPU non può decomprimere i PNG. Il formato di deflate che usa non è adatto per il tipo di abilitazione della GPU di parallelizzazione. Suppongo che la decodifica JPG possa essere parzialmente accelerata dalla GPU, in quanto è coinvolta la conversione dello spazio dei colori. – Kornel

5

ho trovato enormi differenze di prestazioni di animazione quando si utilizzano i file JPEG vs png. Ad esempio, posizionando tre jpeg a schermo intero fianco a fianco in un UIScrollView e scorrendo orizzontalmente su un iPhone4 si ottiene un ritardo e un'animazione a scatti molto spiacevole. Con png non trasparenti delle stesse dimensioni lo scorrimento è scorrevole. Non uso mai jpegs, anche se l'immagine è grande.

8

Cocoanetics blog published a nice iOS performance benchmark di JPG a vari livelli di qualità e PNG, con e senza schiacciamento.

Dalla sua conclusione:

Se è assolutamente necessario un canale alfa o andare con PNG allora si consiglia di installare lo strumento pngcrush sul vostro server web e farlo processare tutti i PNG. In quasi tutti gli altri casi, i file JPEG di alta qualità combinano file di dimensioni più ridotte (ad esempio una trasmissione più veloce) con compressione e rendering più veloci.

Si scopre che PNG sono grandi per piccole immagini che si usa per gli elementi dell'interfaccia utente, ma non sono ragionevoli da utilizzare per eventuali piene applicazioni a schermo come cataloghi o riviste. Lì si desidera che selezioni una qualità di compressione tra il 60 e l'80% a seconda del materiale sorgente .

in termini di ottenere tutto per visualizzare si vuole aggrapparsi casi UIImage da cui avete disegnato una volta perché quelli hanno una versione non compressa cache del file in esse. E dove non è la pausa visiva per la visualizzazione di un'immagine grande sullo schermo, sarà necessario forzare la decompressione per un paio di immagini in anticipo. Ricorda però che, in , ci vorranno grandi quantità di RAM e se il tuo numero di telefono è che lo sovrasta potrebbe causare la chiusura della tua app. NSCache è un luogo ideale per posizionare le immagini utilizzate di frequente perché questo automaticamente si occupa di sfrattare le immagini quando la RAM diventa scarsa.

È un peccato che non abbiamo modo di sapere se un'immagine ha ancora bisogno di decompressione o meno. Anche un'immagine potrebbe avere sfrattata la versione non compressa senza informarci su questo effetto . Quello potrebbe essere un buon Radar da sollevare nel sito di segnalazione degli errori di Apple . Ma fortunatamente l'accesso all'immagine come mostrato sopra non richiede tempo se l'immagine è già decompressa. Quindi potresti semplicemente farlo non solo "just in time" ma anche "just in case".

+0

Esattamente, e JPEGMini e ImageOptim rendono i jpeg veramente piccoli! –

11

C'è una cosa importante da pensare con PNG. Se un PNG è incluso nella build di Xcode, sarà ottimizzato per iOS. Questo è chiamato PNG crush. Se il tuo PNG viene scaricato in fase di esecuzione non sarà schiacciato. I PNG schiacciati funzionano all'incirca come JPG al 100%. I JPG di qualità inferiore funzionano meglio dei JPG di qualità superiore. Quindi, dal punto di vista delle prestazioni, dal più veloce al più lento, sarebbe stato JPG di bassa qualità, JPG di alta qualità, PNG schiacciato, PNG.

Se è necessario scaricare i PNG, è necessario prendere in considerazione la possibilità di schiacciare i PNG sul server prima del download.

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/

Problemi correlati