2009-04-29 6 views
9

Ich ergreife ein Bild von der Kamerarolle und benutze es dann für eine Weile und speichere es als PNG auf dem iPhone auf der Festplatte. Ich stolpere etwas, vermutlich wegen zu wenig Speicher.jpg oder png für UIImage - was ist effizienter?

Macht es einen Unterschied, wenn ich es als PNG oder JPG speichere (vorausgesetzt, ich wähle eine Notiz, um die Qualität im JPG-Fall zu verschlechtern)? Speziell:

  • ist mehr Speicher dann von der UIImage verwendet, nachdem ich es von der Festplatte neu laden, wenn ich es als PNG gespeichert?
  • ist es möglich, den Vorgang zu speichern, da PNG während des Speichervorgangs vorübergehend mehr Speicher verbraucht?
  • Ich hatte angenommen, die UIImage war eine formatneutrale Darstellung und es sollte nicht wichtig sein, aber ich dachte, ich sollte überprüfen.

    Antwort

    10

    Ich habe eine Anwendung in der Filiale, die Zwischenversionen eines Bildes speichern muss, während es bearbeitet wird. In der ursprünglichen Version habe ich das PNG-Format zum Speichern verwendet, um Qualitätsverluste durch mehrfaches Laden und Speichern von JPEG zu vermeiden.

    Irgendwann um die 2.2 Software-Version, führte Apple eine Änderung in den PNG-Code ein, so dass es viel länger dauert, PNG-Daten von einigen Bildern zu speichern. Am Ende musste ich auf das Speichern im JPEG-Format umstellen, da meine Anwendung beim Speichern von Bildern beim Beenden fehlte.

    Außerdem treten Probleme auf, da beim Speichern im PNG-Format die Informationen zur Ausrichtung im UIImage nicht beibehalten werden. Daher wird ein mit der integrierten Kamera im Hochformat aufgenommenes Bild nach dem Speichern und Drehen angezeigt erneut laden.

    0

    Ich habe keine harten Daten, aber ich würde davon ausgehen, dass PNGs vorzuziehen sind, weil Apple PNGs praktisch überall in iPhone OS zu verwenden scheint.

    Wenn Sie jedoch bereits den Code zum Schreiben von PNGs eingerichtet haben, sollte es nicht zu schwer sein, ihn zum Schreiben von JPEGs zu ändern, oder? Probieren Sie beide Methoden aus und sehen Sie, welche besser funktioniert.

    5

    Es hängt davon ab, mit welcher Art von Bildern Sie es zu tun haben. Wenn Sie mit fotografischen Bildern arbeiten, werden JPEGs fast immer kleiner als PNGs sein, ohne erkennbaren Detailverlust, wie das menschliche Auge sehen kann. Umgekehrt, wenn Sie mit sehr nicht-fotografischen Bildern wie GUI-Elementen oder Bildern mit großen Blöcken voller Farben zu tun haben, werden PNGs und JPEGs in der Größe vergleichbar sein, aber das PNG wird verlustfrei speichern, während das JPEG verlustreich sein und sehr sichtbare Artefakte haben. Wenn Sie ein einfaches Bild wirklich haben (sehr große Blöcke von konstanten Farben, zum Beispiel), dann wird ein PNG sehr wahrscheinlich viel kleiner als ein JPEG sein, und wird wieder keine Kompressionsartefakte haben.

    Das Speichern eines Bilds als PNG oder JPEG sollte nicht sehr viel Speicher in Anspruch nehmen. Wenn sich ein Bild im Speicher befindet, wird es normalerweise unkomprimiert im Speicher gespeichert, sodass es sehr schnell zum Bildschirm gezogen werden kann, anstatt es jedes Mal zu dekomprimieren, wenn Sie es rendern möchten. Verglichen mit der Größe des unkomprimierten Bildes ist die Menge an zusätzlichem temporärem Speicher, die Sie komprimieren müssen, sehr gering. Wenn Sie das unkomprimierte Bild in den Speicher einpassen können, müssen Sie sich nicht um den Speicher kümmern, der beim Komprimieren verwendet wird.

    Und natürlich, sobald Sie das Bild in das Dateisystem im nichtflüchtigen Speicher schreiben und das Bild im Speicher zu befreien, ist es wirklich egal, wie groß das komprimierte Bild ist, weil es nicht aufnimmt Hauptspeicher nicht mehr. Die Größe des komprimierten Bildes wirkt sich nur darauf aus, wie viel Flash-Speicher verwendet wird. Dies kann ein Problem sein, hat jedoch keinen Einfluss auf die Wahrscheinlichkeit, dass in Ihrer App nicht genügend Arbeitsspeicher verfügbar ist.

    +0

    Das macht Sinn. Wenn ich Fotos speicherte, die ich mit dem iPhone gemacht habe, hätte das ein Problem, aber bei der Verwendung von PNGs mit relativ einfachen Vektorbildern gab es kein Problem, selbst mit ziemlich großen Bildern zu arbeiten. –

    24

    ich den einen oder anderen Absturz bekommen, vermutlich aufgrund von Speicher


    Dann STOPP, was Sie tun AUGENBLICK und erste Zahl, wenn das ist eigentlich die Ursache des Absturzes.Ansonsten besteht eine sehr gute Chance, dass Sie hier das falsche Problem verfolgen und ein Speicherproblem beheben, das nicht existiert, während die eigentliche Ursache des Absturzes ignoriert wird. Wenn Sie einen Absturz beheben möchten, beginnen Sie mit herauszufinden, was den Absturz verursacht. Nach dem, was "vermutlich" ist, ist das Problem ein Rezept für verschwendete Zeit und Mühe.

    +2

    Kann dem nicht mehr zustimmen. Wenn Sie einen Unfall haben, können Sie nicht einfach eine Menge Dinge darauf werfen und hoffen, dass etwas klebt – rpetrich

    0

    Verwenden Sie möglichst PNG. Als Teil der Kompilierung führt XCode alle PNG-Dateien über ein Dienstprogramm (pngcrush) aus, um sie zu komprimieren und zu optimieren.

    0
    1. ist mehr Speicher dann von der UIImage verwendet, nachdem ich es weg von Platte neu geladen, wenn ich es als PNG gespeichert? => Nein, es ist dieselbe Speichergröße, wenn Sie aus 2 Bildern mit derselben Auflösung und derselben Anzahl von Kanälen importieren. (z. B. RGBA)
    2. ist es möglich, den Vorgang zu speichern, da PNG während des Speichervorgangs vorübergehend mehr Speicher verbraucht? => Nein, es wirkt sich nur auf Ihren Festplattenspeicher aus.
    Verwandte Themen