Question jpg ou png pour UIImage - qui est plus efficace?


Je saisis une image de la pellicule puis je l'utilise pendant un certain temps et je l'enregistre sur le disque en tant que fichier PNG sur l'iPhone. Je reçois un accident étrange, probablement dû à un manque de mémoire.

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

  • UIImage utilise-t-il plus de mémoire après l'avoir rechargé si je l'ai enregistré en tant que fichier PNG?
  • est-il possible que le fait d’enregistrer du PNG consomme plus de mémoire de manière transitoire pendant le processus de sauvegarde?

J'avais supposé que l'UIImage était une représentation de format neutre et cela ne devrait pas poser de problème, mais je pensais devoir vérifier.


9
2018-04-29 04:53


origine


Réponses:


J'ai une application sur le magasin qui doit enregistrer les versions intermédiaires d'une image pendant sa modification. Dans la version originale, j'ai utilisé le format PNG pour enregistrer, afin d'éviter une perte de qualité lors du chargement et de l'enregistrement JPEG plusieurs fois.

Autour de la version 2.2 du logiciel, Apple a introduit un changement dans le code d'écriture PNG, de sorte qu'il faut beaucoup plus de temps pour enregistrer les données PNG de certaines images. J'ai fini par changer pour enregistrer au format JPEG, parce que mon application était en cours de délai lors de la tentative d'enregistrement des images à la sortie.

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


10
2018-04-29 19:19




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


alors ARRÊTEZ CE QUE VOUS FAITES MAINTENANT et d'abord comprendre si c'est effectivement la cause de l'accident. Sinon, il y a de très fortes chances que vous cherchiez le mauvais problème ici, en corrigeant un problème de mémoire qui n'existe pas tout en ignorant la cause réelle de la panne. Si vous voulez réparer un crash, commencer par comprendre ce qui a causé le crash. Suivre ce qui est "vraisemblablement" le problème est une recette pour perdre du temps et des efforts.


24
2018-04-29 17:18



Cela dépend du type d'images que vous traitez. Si vous travaillez avec des images photographiques, les fichiers JPEG seront presque toujours plus petits que les fichiers PNG, sans perte de détail perceptible, comme le montre l'œil humain.

Inversement, si vous avez affaire à des images hautement non photographiques telles que des éléments d'interface graphique ou des images avec de grands blocs de couleurs solides, les formats PNG et JPEG seront comparables, mais le format PNG économisera sans perte. artefacts très visibles. Si tu as un vraiment image simple (de très gros blocs de couleurs constantes, par exemple), alors un fichier PNG sera très probablement beaucoup plus petit qu'un fichier JPEG, et ne comportera pas non plus d'artefacts de compression.

Le fait de sauvegarder une image au format PNG ou JPEG ne doit pas prendre beaucoup de mémoire transitoire. Lorsqu'une image est en mémoire, elle est généralement stockée non compressée en mémoire afin de pouvoir être dessinée très rapidement sur l'écran, au lieu de la décompresser chaque fois que vous souhaitez la rendre. Par rapport à la taille de l'image non compressée, la quantité 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 en mémoire, vous n'avez pas à vous soucier de la mémoire utilisée lors de la compression.

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


5
2018-04-29 05:19



Vos blocages peuvent provenir d'une fuite de mémoire connue dans UIImagePickerController.

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


1
2018-06-25 23:38



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

Toutefois, si vous avez déjà configuré le code pour écrire des fichiers PNG, il ne devrait pas être trop difficile de le modifier pour écrire des fichiers JPEG, n'est-ce pas? Essayez simplement les deux méthodes et voyez ce qui fonctionne le mieux.


0
2018-04-29 05:06



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


0
2018-04-29 18:51



  1. est plus de mémoire alors utilisé par l'UIImage après que je le recharge 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 que le fait d’enregistrer du PNG consomme plus de mémoire de manière transitoire pendant le processus de sauvegarde? => Non, cela affecte uniquement votre mémoire disque.

0
2017-09-20 05:01