Question

Je saisis une image sur le rouleau de l'appareil photo, puis je l'utilise pendant un moment et je l'enregistre sur le disque au format PNG sur l'iPhone. Je reçois un crash étrange, probablement dû à un manque de mémoire.

Est-ce que cela fait une différence si je l'enregistre au format PNG ou JPG (en supposant que je choisis note pour dégrader la qualité dans le cas de JPG)? Plus précisément:

  • UIImage utilise-t-il plus de mémoire après son rechargement hors du disque si je l’ai enregistré au format PNG?
  • est-il possible d’enregistrer le fichier car PNG consomme plus de mémoire pendant le processus de sauvegarde?

J'avais supposé que UIImage était une représentation de format neutre et cela ne devrait pas avoir d'importance, mais j'ai pensé que je devrais vérifier.

Était-ce utile?

La solution

J'ai une application sur le magasin qui doit enregistrer les versions intermédiaires d'une image lors de son édition. Dans la version originale, j’utilisais le format PNG pour la sauvegarde, afin d’éviter toute perte de qualité liée au chargement et à la sauvegarde JPEG plusieurs fois.

Vers la version de logiciel 2.2, Apple a modifié le code d’écriture au format PNG, de sorte que la sauvegarde des données PNG à partir de certaines images prend beaucoup plus de temps. J'ai fini par passer à l'enregistrement au format JPEG, car mon application était en cours d'exécution lorsque j'essayais d'enregistrer des images à la sortie.

De plus, vous rencontrerez des problèmes car l'enregistrement au format PNG ne conserve pas l'orientation "orientation". informations dans UIImage. Ainsi, une photo prise en orientation Portrait avec la caméra intégrée apparaîtra pivotée après son enregistrement et son rechargement.

Autres conseils

  

Je reçois un crash étrange, probablement à cause d'un manque de mémoire

Puis ARRÊTEZ CE QUE VOUS FAITES MAINTENANT et déterminez d’abord si c’est la cause de l’accident. Sinon, il est fort probable que vous cherchiez le mauvais problème ici, en corrigeant un problème de mémoire inexistant tout en ignorant la cause réelle du blocage. Si vous souhaitez réparer un blocage, commencez par déterminer la cause du blocage . Suivi de ce qui est "probablement" " le problème est une recette pour le temps et les efforts perdus.

Cela dépend du type d’image avec lequel vous traitez. Si vous utilisez des images photographiques, les fichiers JPEG seront presque toujours plus petits que les fichiers PNG, sans perte perceptible des détails visibles par l'œil humain.

Inversement, si vous utilisez des images hautement non photographiques telles que des éléments d'interface graphique ou des images avec de grands blocs de couleurs unies, les fichiers PNG et JPEG auront une taille comparable. Cependant, le format PNG économisera sans perte, alors que le format avec pertes et ont des artefacts très visibles. Si vous avez une image vraiment simple (de très grands blocs de couleurs constantes, par exemple), un fichier PNG sera très probablement beaucoup plus petit qu'un fichier JPEG et, encore une fois, ne comportera aucun artefact de compression.

Le fait de sauvegarder une image au format PNG ou JPEG ne devrait pas occuper beaucoup de mémoire transitoire. Lorsqu'une image est en mémoire, elle est généralement stockée dans une mémoire non compressée afin de pouvoir être affichée très rapidement à l'écran, au lieu de devoir la décompresser à chaque fois que vous souhaitez la restituer. Par rapport à la taille de l'image non compressée, la quantité de mémoire de stockage temporaire supplémentaire dont vous avez besoin pour la compresser est très faible. Si vous pouvez adapter l’image non compressée à la mémoire, vous n’aurez plus à vous soucier de la mémoire utilisée lors de la compression.

Et bien sûr, une fois que vous écrivez l'image sur le système de fichiers dans un stockage non volatile et que vous libérez l'image en mémoire, peu importe la taille de l'image compressée, car elle ne prend pas la partie principale. mémoire plus. La taille de l'image compressée affecte uniquement la quantité de stockage flash utilisée, ce qui peut être un problème, mais cela n'affecte pas la probabilité que votre application manque de mémoire.

Vos collisions peuvent provenir d’une fuite de mémoire connue dans le UIImagePickerController.

Cela devrait vous aider à résoudre ce problème.

Je n'ai pas de données tangibles, mais je suppose que les fichiers PNG sont préférables, car Apple semble les utiliser presque partout dans l'iPhone OS.

Cependant, si vous avez déjà configuré le code pour écrire des PNG, il ne devrait pas être trop difficile de le changer pour écrire des JPEG, le devrait-il? Essayez simplement les deux méthodes et voyez laquelle fonctionne le mieux.

Utilisez PNG chaque fois que possible. Dans le cadre de la compilation, XCode exécute tous les fichiers PNG via un utilitaire (pngcrush) pour les compresser et les optimiser.

  1. est plus de mémoire que celle utilisée par UIImage après le rechargement de disque si je l'ai enregistré en tant que PNG? = > Non, c'est la même taille de mémoire si vous importez à partir de 2 images ayant la même résolution et le même nombre de canaux. (comme RGBA)
  2. est-il possible d’enregistrer le fichier au format PNG, qui utilise plus de mémoire pendant le processus de sauvegarde? = > Non, cela affecte uniquement la mémoire de votre disque.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top