Domanda

Sto afferrando un'immagine dal rullino fotografico e quindi la sto usando per un po 'e la salvo sul disco come PNG su iPhone. Sto ottenendo lo strano incidente, presumibilmente a causa della memoria insufficiente.

Fa differenza se lo salvo come PNG o JPG (supponendo che scelga la nota per degradare la qualità nel caso JPG)? In particolare:

  • viene utilizzata più memoria da UIImage dopo averla ricaricata dal disco se l'ho salvata come PNG?
  • è possibile l'atto di salvataggio poiché PNG consuma più memoria temporaneamente durante il processo di salvataggio?

Avevo supposto che UIImage fosse una rappresentazione neutra dal punto di vista del formato e non dovrebbe importare, ma ho pensato di verificarlo.

È stato utile?

Soluzione

Ho un'applicazione nello store che deve salvare le versioni intermedie di un'immagine mentre viene modificata. Nella versione originale, ho usato il formato PNG per il salvataggio, per evitare la perdita di qualità dovuta al caricamento e al salvataggio di JPEG più volte.

Qualche tempo dopo la versione 2.2 del software, Apple ha introdotto una modifica nel codice di scrittura PNG, in modo tale da impiegare molte volte più tempo per salvare i dati PNG da alcune immagini. Alla fine ho dovuto passare al salvataggio in formato JPEG, perché la mia applicazione stava scadendo quando cercavo di salvare le immagini all'uscita.

Inoltre, si verificheranno problemi perché il salvataggio in formato PNG non conserva l'orientamento " " informazioni in UIImage, quindi una foto scattata con orientamento verticale con la fotocamera integrata apparirà ruotata dopo averla salvata e ricaricata.

Altri suggerimenti


  

Ricevo lo strano incidente, presumibilmente a causa di memoria insufficiente


Quindi FERMA COSA STAI FACENDO GIUSTO e prima scopri se questa è effettivamente la causa dell'incidente. Altrimenti c'è una buona possibilità che tu stia inseguendo il problema sbagliato qui, risolvendo un problema di memoria che non esiste mentre ignori la vera causa dell'incidente. Se vuoi riparare un crash, inizia a capire cosa ha causato il crash . In seguito a ciò che è "presumibilmente" il problema è una ricetta per sprecare tempo e fatica.

Dipende dal tipo di immagini con cui hai a che fare. Se hai a che fare con immagini fotografiche, i file JPEG saranno quasi sempre più piccoli dei PNG, senza alcuna perdita evidente di dettagli come può vedere l'occhio umano.

Al contrario, se hai a che fare con immagini altamente non fotografiche come elementi della GUI o immagini con grandi blocchi di colori solidi, PNG e JPEG avranno dimensioni comparabili, ma il PNG salverà senza perdita mentre JPEG sarà con perdita e con artefatti molto visibili. Se hai un'immagine davvero semplice (blocchi molto grandi di colori costanti, ad es.), Molto probabilmente un PNG sarà molto più piccolo di un JPEG e di nuovo non avrà artefatti di compressione.

L'atto di salvare un'immagine come PNG o JPEG non dovrebbe occupare molta memoria transitoria. Quando un'immagine è in memoria, in genere viene memorizzata non compressa in memoria in modo che possa essere disegnata sullo schermo molto rapidamente, invece di doverla decomprimere ogni volta che si desidera renderizzarla. Rispetto alle dimensioni dell'immagine non compressa, la quantità di memoria temporanea aggiuntiva necessaria per comprimerla è molto piccola. Se riesci ad adattare l'immagine non compressa in memoria, non devi preoccuparti della memoria utilizzata durante la compressione.

E ovviamente, una volta che scrivi l'immagine nel file system in una memoria non volatile e libera l'immagine in memoria, non importa davvero quanto sia grande l'immagine compressa, perché non occupa memoria ancora. La dimensione dell'immagine compressa influisce solo sulla quantità di memoria flash utilizzata, il che può essere un problema, ma non influisce molto sulla probabilità che la tua app esaurisca la memoria.

Gli arresti anomali potrebbero provenire da una perdita di memoria nota in UIImagePickerController.

Questo dovrebbe aiutarti a risolvere il problema.

Non ho dati concreti, ma suppongo che i PNG siano preferibili perché Apple sembra usare i PNG praticamente ovunque nel sistema operativo iPhone.

Tuttavia, se hai già impostato il codice per la scrittura di PNG, non dovrebbe essere troppo difficile cambiarlo per scrivere JPEG, vero? Prova entrambi i metodi e vedi quale funziona meglio.

Usa PNG ove possibile. Come parte della compilazione XCode esegue tutti i file PNG attraverso un'utilità (pngcrush) per comprimerli e ottimizzarli.

  1. è più memoria quindi utilizzata da UIImage dopo che l'ho ricaricata disco se l'ho salvato come PNG? = & Gt; No, ha le stesse dimensioni della memoria se importi da 2 immagini con la stessa risoluzione e lo stesso numero di canali. (come RGBA)
  2. è possibile l'atto di salvataggio poiché PNG consuma più memoria in modo transitorio durante il processo di salvataggio? = & Gt; No, influisce solo sulla memoria del disco.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top