Quand utiliser PNG ou JPG dans le développement de l'iPhone?

J'ai une application qui affichera un tas d'images dans un diaporama. Ces images feront partie du bundle, ainsi dissortingbué avec l'application.

Toutes les images sont des photographies ou des photographies, etc.

J'ai lu qu'il est préférable d'utiliser le format PNG comme format d'image, mais vu que la version JPG sera beaucoup plus petite, je préfère l'utiliser.

Existe-t-il des directives sur le format à utiliser et dans quel cas?

Les PNG sont parfaits pour les pixels (sans perte) et nécessitent très peu d'énergie CPU supplémentaire pour s'afficher. Toutefois, les files PNG volumineux peuvent prendre plus de time à lire à partir du stockage que les formats d'image compressés, et donc être plus lents à afficher.

Les JPG sont plus petits à stocker, mais avec perte (la quantité dépend du niveau de compression), et pour les afficher nécessite un algorithm de déencoding beaucoup plus compliqué. Mais la qualité de compression et d'image typique est généralement suffisante pour les photos.

Utilisez les files JPG pour les photos et tout ce qui est volumineux, et les files PNG pour tout ce qui est petit et / ou conçu pour être affiché "pixel parfait" (par ex. Petites icons) ou en tant que partie d'une superposition transparente composée, etc.

Apple optimise les images PNG incluses dans votre set d'applications iPhone. En fait, l'iPhone utilise un enencoding spécial dans lequel les octets de couleur sont optimisés pour le matériel. XCode gère ce encoding spécial pour vous lorsque vous construisez votre projet. Ainsi, vous voyez des avantages supplémentaires à l'utilisation de PNG sur un iPhone autre que leur taille. Pour cette raison, il est fortement recommandé d'utiliser des images PNG pour toutes les images qui apparaissent dans l'interface (dans une vue de table, des labels, etc.).

En ce qui concerne l'affichage d'une image en plein écran comme une photo, vous pouvez toujours bénéficier des avantages du format PNG car ils ne sont pas sans perte et la qualité visuelle devrait être meilleure qu'un format JPG sans parler de l'utilisation des ressources pour décoder l'image. Vous devrez peut-être diminuer la qualité de vos JPG afin de voir un réel avantage dans la taille du file, mais vous affichez des images non-optimales.

La taille du file est certainement un facteur mais il y a d'autres considérations à prendre en count lors du choix d'un format d'image.

Il y a une chose importante à considérer avec les PNG. Si un file PNG est inclus dans votre build Xcode, il sera optimisé pour iOS. C'est ce qu'on appelle un écrasement PNG. Si votre file PNG est téléchargé au moment de l'exécution, il ne sera pas écrasé. Les files PNG écrasés fonctionnent à peu près de la même manière que les files JPG à 100%. Les files JPG de qualité inférieure fonctionnent mieux que les files JPG de qualité supérieure. Donc, du sharepoint vue de la performance du plus rapide au plus lent, il irait JPG de qualité inférieure, JPG de haute qualité, PNG écrasé, PNG.

Si vous devez download des files PNG, vous devriez envisager d'écraser les files PNG sur le server avant le téléchargement.

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

Le blog Cocoanetics a publié une belle reference de performances iOS de JPG à différents niveaux de qualité, et des PNG, avec ou sans écrasement.

De sa conclusion:

Si vous avez absolument besoin d'un canal alpha ou si vous devez utiliser des files PNG, il est conseillé d'installer l'outil pngcrush sur votre server Web et de traiter tous vos files PNG. Dans presque tous les autres cas, les files JPEG haute qualité combinent des tailles de file plus petites (c.-à-d. Une transmission plus rapide) avec une compression et un rendu plus rapides.

Il s'avère que les files PNG sont parfaits pour les petites images que vous utiliseriez pour les éléments de l'interface user, mais ils ne sont pas raisonnables à utiliser pour les applications en plein écran comme les catalogues ou les magazines. Là vous voudriez choisir une qualité de compression entre 60 et 80% selon votre matériel source.

En termes de tout faire pour afficher, vous voudrez vous accrocher aux instances UIImage à partir de laquelle vous avez dessiné une fois parce que ceux-ci ont une version non compressée du file. Et lorsque vous ne faites pas la pause visuelle pour qu'une grande image apparaisse à l'écran, vous devrez forcer la décompression pour quelques images à l'avance. Mais gardez à l'esprit que ceux-ci prendront de grandes quantités de RAM et si vous exagérez ce qui pourrait entraîner la fin de votre application. NSCache est un bon endroit pour placer des images fréquemment utilisées car cela prend automatiquement soin d'expulser les images lorsque la RAM devient rare.

Il est regrettable que nous n'ayons aucun moyen de savoir si une image doit encore être décompressée ou non. Une image peut également avoir expulsé la version non compressée sans nous en informer. Cela pourrait être un bon radar à soulever sur le site de rapport de bug d'Apple. Mais heureusement, l'access à l'image comme indiqué ci-dessus ne prend pas de time si l'image est déjà décompressée. Vous pouvez donc le faire non seulement "juste à time", mais aussi "juste au cas où".

Je pensais juste partager un peu de données de performance de décompression …

Je fais du prototypage d'une visionneuse à 360 degrés – un carrousel où l'user peut faire défiler une série de photos sockets sous des angles différents, pour donner l'printing de pouvoir tourner en douceur un object.

J'ai chargé datatables d'image dans un tableau de NSData pour prendre l'I / O de file hors de l'équation, mais créer NSImage à la volée. Testant à près de 25 images par seconde et en regardant les instruments, je vois que l'application est clairement liée au processeur et qu'il y a une augmentation d'environ 10% de la charge du CPU montrant ~ 275 kb png vs ~ 75 kb jpg.

Je ne peux pas dire avec certitude, mais je pense que la limite du CPU est juste de l'exécution générale du programme et de déplacer toutes datatables en memory, mais cette décompression d'image est faite sur le GPU. Dans tous les cas, l'argument de performance JPG vs. PNG semble favoriser JPG, en particulier lorsque les tailles de file plus petites (et donc les plus petites tailles d'objects en memory au less dans certaines parties de la string) sont sockets en count.

Bien sûr, chaque situation est différente, il n'y a pas de substitut aux tests …

J'ai trouvé des différences énormes dans les performances d'animation lors de l'utilisation de jpegs vs png. Par exemple, placer côte à côte trois jpeg de la taille d'un écran dans un UIScrollView et faire défiler horizontalement sur un iPhone4 entraîne un décalage et une animation saccadée complètement désagréable. Avec des png non transparents de mêmes dimensions, le défilement est lisse. Je n'utilise jamais de jpeg, même si l'image est grande.

Je pense que si vous voulez utiliser transparent, vous n'avez pas le choix, sauf PNG. Mais, si votre arrière-plan est déjà opaque, vous pouvez utiliser JPG. C'est la seule différence que je peux voir