8

Ho visto questa domanda posta dozzine di volte ma non ho mai risposto.Ridimensionamento di una UIImage su iPhone con un ingombro ridotto di memoria

Come ridimensionare un UIImage (in particolare uno restituito dalla fotocamera UIImagePickerController). Quando provo uno qualsiasi dei metodi disponibili, ottengo un picco di memoria tra 20 e 40 MB. Se ne va ma so che su qualche hardware questo è assolutamente inaccettabile.

ho provato i metodi che utilizzano le seguenti operazioni: drawInRect :, CGContextDrawImage(), imageWithCGImage: scala: orientamento:

Capisco che immagini non compresse che vivono nella memoria occupano più spazio su disco rispetto, ma sembra che le più comuni operazioni di ridimensionamento di UIImage implichino la creazione di copie dei dati dell'immagine.

Anche Apple consiglia di ridimensionare immediatamente un'immagine scattata con la fotocamera. Tuttavia (b/c credo che sappiano che questo argomento è intensamente complesso) non offrono parole di guida su come gestirlo. Soprattutto come farlo nel momento in cui i dati dell'immagine vengono restituiti.

Qualcuno ha un metodo semplice per ridimensionare un UIImage grande conservando la memoria? So che è un compito arduo.

+1

Altri pensieri? Potrei inviare questo a Apple. – sambecker

risposta

0

Non ho una risposta grande al 100% ma hai un paio di opzioni. L'iphone ti consentirà di accedere alla modalità di modifica/ritaglio, ecc. Penso che sia quello che Apple vuole che tu usi. Per noi non era del tutto accettabile. Raccogliamo i dati dell'immagine, otteniamo i dati dei pixel, rilasciamo l'immagine originale. Quindi ridimensiona la metà superiore, poi secondo noi stessi. Pubblicherei del codice ma non sono al lavoro. Posso in un paio di giorni dopo le vacanze ...

+1

A seconda di come "ottieni" i dati dei pixel, potrebbe verificarsi una copia non necessaria (una volta all'interno di "UIImmagine" e di nuovo nel buffer) – rpetrich

1

Un metodo che utilizza poca memoria è quello di creare un contesto bitmap con CGBitmapContextCreate e disegnare la UIImage in esso. L'unica memoria aggiuntiva che verrà utilizzata è ciò che hai malloc ed alcuni piccoli overhead CGContext.

Se si desidera ottenere fantasia, si potrebbe invece mmap con il flag impostato PROT_WRITE ed essere limitato solo dallo spazio di indirizzamento virtuale

+0

Ho provato questo metodo ma non sono riuscito a conservare la memoria. Esiste uno schema di conservazione/rilascio specifico che inizia e termina con una UIImage che è possibile condividere? – sambecker

+1

Non ho esempi di codice perché uso semplicemente l'API privata molto più semplice nelle mie applicazioni jailbreak. Il codice sopra ti porterà un'immagine ridimensionata in un buffer a tua scelta. Per creare un 'UIImage', inserisci le seguenti API:' CGDataProviderCreateWithData', 'CGImageCreate' e' - [UIImage initWithCGImage:] '. Assicurati di seguire i corretti schemi di gestione della memoria e di specificare una callback di rilascio personalizzata appropriata per il tuo 'CGDataProvider'. – rpetrich

1

Hai provato il benchmarking l'occupazione di memoria utilizzata ridimensionando UIImage con i metodi di categoria descritto nel seguente blog post.

Ho utilizzato un ridimensionamento simile per creare miniature per immagini più grandi scaricate dall'app. Le mie immagini non sono probabilmente grandi come quelle che stai selezionando dal tuo controller di selezione di immagini, ma ho riscontrato risultati piuttosto buoni.

Spero che aiuti in qualche modo.

0

Probabilmente hai immagini più grandi di quelle che ho gestito nelle mie app, ma non dici di quali dimensioni stiamo parlando. Posso solo suggerire Quartz o il tuo filtro di ridimensionamento facendo l'immagine riga per riga.

1

Ecco un paio di progetti git che coprono il ridimensionamento UIImage. Io uso il secondo e funziona come un fascino. Ha un bel progetto di esempio incluso in modo da poter vedere esattamente come usarlo. Penso che anche il primo abbia un campione, anche se non ho provato a usarlo o guardato da vicino.

https://github.com/coryalder/UIImage_Resize

https://github.com/AliSoftware/UIImage-Resize

Se siete davvero preoccupati per occupazione di memoria si potrebbe fare qualcosa di pazzo-ish come il ridimensionamento pezzi di immagine e li cuciture di nuovo insieme in memoria ... ma che probabilmente solo per immagini molto grandi. Le immagini dalla fotocamera integrata dovrebbero essere gestite correttamente usando la memoria disponibile.

Problemi correlati