Wann sollte PNG oder JPG in der iPhone-Entwicklung verwendet werden?


98

Ich habe eine App, die eine Reihe von Bildern in einer Diashow anzeigt. Diese Bilder werden Teil des Bundles sein und somit mit der App verteilt.

Alle Bilder sind Fotos oder Fotos usw.

Ich habe gelesen, dass es bevorzugt wird, PNG als Bildformat zu verwenden, aber da die JPG-Version viel kleiner sein wird, würde ich das lieber verwenden.

Gibt es Richtlinien, welches Format in welchem ​​Fall verwendet werden soll?


Ich wollte hinzufügen, dass die Originalbilder bereits alle im JPG-Format vorliegen, wenn dies einen Unterschied macht.
Maverick

Antworten:


140

PNGs sind pixelgenau (verlustfrei) und erfordern nur sehr wenig zusätzliche CPU-Energie für die Anzeige. Das Lesen großer PNGs aus dem Speicher kann jedoch länger dauern als das Komprimieren von Bildformaten und daher langsamer angezeigt werden.

JPGs sind kleiner zu speichern, aber verlustbehaftet (die Menge hängt von der Komprimierungsstufe ab). Um sie anzuzeigen, ist ein viel komplizierterer Decodierungsalgorithmus erforderlich. Die typische Komprimierung und Bildqualität ist jedoch für Fotos normalerweise völlig ausreichend.

Verwenden Sie JPGs für Fotos und für alles, was groß ist, und PNGs für alles, was klein und / oder "pixelgenau" (z. B. kleine Symbole) oder als Teil einer zusammengesetzten transparenten Überlagerung usw. angezeigt werden soll.


1
Ich habe noch keine Daten zur Dekodierungsleistung von JPEG vs PNG vs iPNG gesehen. Manchmal ist das stärker komprimierte Format besser, da weniger E / A erforderlich sind. Ich bin mir nicht sicher, wie schnell das Flash-Laufwerk des iPhones ist. Und ich würde definitiv nicht sagen, dass die PNG-Dekompression "sehr wenig" Energie erfordert. Die Datei Other.artwork scheint aus Bitmap-Rohdaten zu bestehen, vermutlich weil der CPU- / Speicher-Overhead der PNG-Dekomprimierung für häufig verwendete UI-Komponenten zu hoch ist.
tc.

2
In meinem aktuellen Projekt haben wir aufgrund einer Transparenzanforderung sehr große PNG-Dateien. Die Festplatten-E / A überwiegt bei weitem die Zeit, die für die Dekodierung eines JPEGs aufgewendet wurde. Beachten Sie, dass PNGs auch mit einem anderen Algorithmus komprimiert werden.
John

2
Ich dachte, ich würde einen zusätzlichen Tipp für diejenigen hinzufügen, die versuchen, die Bildleistung zu maximieren. Wenn Sie JPGs gut komprimiert haben, können Sie die JPG-Rohdaten im Voraus in NSData-Objekte laden (möglicherweise in einem Array oder Wörterbuch) und die JPGs mit UIImage: imageFromData erstellen, wenn Sie sie anzeigen möchten. Die JPG-Daten können 10-100x kleiner sein als die Bitmap-Bilddaten, aber Sie können den (relativ langsamen) E / A-Teil frühzeitig aus dem Weg räumen. Seien Sie natürlich vorsichtig, wie viele Daten Sie auf diese Weise zwischenspeichern / vorladen.
Nigel Flack

2
Ich habe einige Daten zu den Compersionszeiten gefunden: cocoanetics.com/2012/09/… Es scheint, dass die Verwendung von PNG nicht schneller als JPG ist;)
Maciej Kozieł

20

Apple optimiert PNG-Bilder, die in Ihrem iPhone-App-Bundle enthalten sind. Tatsächlich verwendet das iPhone eine spezielle Codierung, bei der die Farbbytes für die Hardware optimiert sind. XCode übernimmt diese spezielle Codierung für Sie, wenn Sie Ihr Projekt erstellen. Sie sehen also zusätzliche Vorteile bei der Verwendung von PNGs auf einem iPhone, die nicht die Größe berücksichtigen. Aus diesem Grund wird definitiv empfohlen, PNGs für alle Bilder zu verwenden, die als Teil der Benutzeroberfläche angezeigt werden (in einer Tabellenansicht, Beschriftungen usw.).

Bei der Anzeige eines Vollbilds wie eines Fotos können Sie dennoch Vorteile mit PNGs erzielen, da diese verlustfrei sind und die visuelle Qualität besser sein sollte als bei JPGs, ganz zu schweigen von der Ressourcennutzung beim Dekodieren des Bildes. Möglicherweise müssen Sie die Qualität Ihrer JPGs verringern, um einen echten Vorteil bei der Dateigröße zu erzielen. Anschließend werden jedoch nicht optimale Bilder angezeigt.

Die Dateigröße ist sicherlich ein Faktor, aber bei der Auswahl eines Bildformats spielen auch andere Überlegungen eine Rolle.


5
In meinem Benchmark hat die Xcode-Optimierung Dateien tatsächlich langsamer gemacht, wahrscheinlich weil Festplatten-E / A und nicht CPU der Engpass ist.
Kornel

1
"Apple optimiert PNG-Bilder, die in Ihrem iPhone-App-Bundle enthalten sind" - Bedeutet dies, dass PNG-Bilder, die dynamisch heruntergeladen werden, nicht optimiert werden?
Robert

1
Nein, dynamisch heruntergeladene PNGs sind nicht optimiert. Bei der Optimierung wird im Grunde nur die Bytereihenfolge von RGBA auf BGRA ausgetauscht, was der iPhone-Grafikchip intern verwendet. Weitere Infos hier: graphicsoptimization.com/blog/?p=259
Nick Lockwood

11

Bei PNGs ist eine wichtige Sache zu beachten. Wenn ein PNG in Ihrem Xcode-Build enthalten ist, wird es für iOS optimiert. Dies wird als PNG-Crush bezeichnet. Wenn Ihr PNG zur Laufzeit heruntergeladen wird, wird es nicht zerstört. Crushed PNGs laufen ungefähr genauso wie 100% JPGs. JPGs mit geringerer Qualität laufen besser als JPGs mit höherer Qualität. Vom Standpunkt der Leistung vom schnellsten zum langsamsten würde es also JPG von geringer Qualität, JPG von hoher Qualität, Crushed von PNG und PNG geben.

Wenn Sie PNGs herunterladen müssen, sollten Sie in Betracht ziehen, die PNGs vor dem Download auf dem Server zu zerstören.

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


9

Der Cocoanetics-Blog veröffentlichte einen schönen iOS-Leistungsbenchmark für JPGs mit verschiedenen Qualitätsstufen und PNGs mit und ohne Crushing.

Aus seiner Schlussfolgerung:

Wenn Sie unbedingt einen Alpha-Kanal benötigen oder mit PNGs arbeiten müssen, ist es ratsam, das Tool pngcrush auf Ihrem Webserver zu installieren und alle Ihre PNGs verarbeiten zu lassen. In fast allen anderen Fällen kombinieren hochwertige JPEGs kleinere Dateigrößen (dh eine schnellere Übertragung) mit einer schnelleren Komprimierung und Wiedergabe.

Es stellt sich heraus, dass PNGs ideal für kleine Bilder sind, die Sie für UI-Elemente verwenden würden, aber für Vollbildanwendungen wie Kataloge oder Magazine nicht sinnvoll sind. Dort möchten Sie je nach Ausgangsmaterial eine Komprimierungsqualität zwischen 60 und 80% wählen.

Um alles anzuzeigen, sollten Sie sich an UIImage-Instanzen halten, aus denen Sie einmal gezeichnet haben, da diese eine zwischengespeicherte unkomprimierte Version der Datei enthalten. Und wenn Sie nicht die visuelle Pause haben, damit ein großes Bild auf dem Bildschirm angezeigt wird, müssen Sie die Dekomprimierung für einige Bilder im Voraus erzwingen. Beachten Sie jedoch, dass diese viel RAM benötigen. Wenn Sie dies übertreiben, wird Ihre App möglicherweise beendet. NSCache ist ein großartiger Ort, um häufig verwendete Bilder zu platzieren, da dadurch automatisch die Bilder entfernt werden, wenn der Arbeitsspeicher knapp wird.

Es ist bedauerlich, dass wir nicht wissen können, ob ein Bild noch dekomprimiert werden muss oder nicht. Auch ein Bild könnte die unkomprimierte Version entfernt haben, ohne uns darüber zu informieren. Das könnte ein gutes Radar sein, das Sie auf Apples Website zur Fehlerberichterstattung ansprechen können. Glücklicherweise dauert der Zugriff auf das Bild wie oben gezeigt keine Zeit, wenn das Bild bereits dekomprimiert ist. Sie können dies also nicht nur "just in time", sondern auch "just in case" tun.


Genau, und JPEGMini und ImageOptim machen JPEGs wirklich klein!
Electronix384128

7

Ich dachte nur, ich würde ein paar Daten zur Dekomprimierungsleistung teilen ...

Ich mache ein Prototyping eines 360-Grad-Betrachters - eines Karussells, in dem der Benutzer eine Reihe von Fotos aus verschiedenen Winkeln durchdrehen kann, um den Eindruck zu erwecken, ein Objekt reibungslos drehen zu können.

Ich habe die Bilddaten in ein Array von NSData geladen, um Datei-E / A aus der Gleichung zu entfernen, aber NSImage's im laufenden Betrieb erstellt. Testen mit nahezu maximaler Bildrate (~ 25 fps) und Ansehen in Instrumenten Ich sehe, dass die App eindeutig an die CPU gebunden ist und die CPU-Auslastung um ca. 10% zunimmt, was ~ 275 kb PNGs gegenüber ~ 75 kb JPGs anzeigt.

Ich kann nicht sicher sagen, aber ich vermute, dass das CPU-Limit nur von der allgemeinen Programmausführung und dem Verschieben aller Daten im Speicher herrührt, aber diese Bilddekomprimierung erfolgt auf der GPU. In beiden Fällen scheint das Leistungsargument JPG vs. PNG JPG zu bevorzugen, insbesondere wenn die kleineren Dateigrößen (und daher zumindest in einigen Teilen der Kette kleinere Objekte im Speicher) berücksichtigt werden.

Natürlich ist jede Situation anders, es gibt keinen Ersatz für Tests ...


2
Die GPU kann PNGs nicht dekomprimieren. Das verwendete Deflate-Format ist nicht für die Art der Parallelisierung geeignet, die die GPU ermöglicht. Ich denke, die JPG-Decodierung kann teilweise GPU-beschleunigt werden, da eine Farbraumkonvertierung erforderlich ist.
Kornel

5

Ich habe massive Unterschiede in der Animationsleistung bei der Verwendung von JPEGs und PNG festgestellt. Wenn Sie beispielsweise drei JPEGs in Bildschirmgröße nebeneinander in einer UIScrollView platzieren und auf einem iPhone4 horizontal scrollen, führt dies zu Verzögerungen und einer durch und durch unangenehmen ruckartigen Animation. Bei nicht transparenten PNGs mit den gleichen Abmessungen ist das Scrollen reibungslos. Ich benutze niemals JPEGs, auch wenn das Bild groß ist.


1

Ich denke, wenn Sie transparent verwenden möchten, haben Sie keine andere Wahl als PNG. Wenn Ihr Hintergrund jedoch bereits undurchsichtig ist, können Sie JPG verwenden. Das ist der einzige Unterschied, den ich sehen kann


3
Hierbei werden keine Leistungsaspekte von JPG gegenüber PNG berücksichtigt.
DaveMac

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.