Meine Anwendung lädt eine Reihe von Bilddateien aus dem Netzwerk herunter und speichert sie auf der lokalen iPhone-Festplatte. Einige dieser Bilder sind ziemlich groß (z. B. Breiten größer als 500 Pixel). Da das iPhone nicht einmal groß genug ist, um das Bild in seiner Originalgröße anzuzeigen, plane ich, die Größe des Bilds auf etwas kleiner zu ändern, um Platz und Leistung zu sparen.
Einige dieser Bilder sind JPEGs und werden nicht als übliche 60% -Qualitätseinstellung gespeichert.
Wie kann ich die Größe eines Bildes mit dem iPhone SDK ändern und wie kann ich die Qualitätseinstellung eines JPEG-Bildes ändern?
Der einfachste und einfachste Weg, die Größe Ihrer Bilder zu ändern, ist dieser
quelle
Die oben genannten Methoden eignen sich gut für kleine Bilder. Wenn Sie jedoch versuchen, die Größe eines sehr großen Bildes zu ändern, geht Ihnen schnell der Speicher aus und die App stürzt ab. Eine viel bessere Möglichkeit besteht darin
CGImageSourceCreateThumbnailAtIndex
, die Größe des Bildes zu ändern, ohne es zuvor vollständig zu dekodieren.Wenn Sie den Pfad zu dem Bild haben, dessen Größe Sie ändern möchten, können Sie Folgendes verwenden:
Weitere Details hier .
quelle
CGImageSource
neben Bildern und PDFs auch unterstützt werden?inSampleSize
, das vom Android-Decoder verwendet wird. Und dies ist die einzige Antwort, die eine Möglichkeit bietet, ein Bild speichereffizient zu verkleinern.Der beste Weg, um Bilder zu skalieren, ohne das Seitenverhältnis zu verlieren (dh ohne das Bild zu dehnen), ist die Verwendung dieser Methode:
Fügen Sie diese Methode Ihrer Utility-Klasse hinzu, damit Sie sie im gesamten Projekt verwenden und wie folgt darauf zugreifen können:
Diese Methode sorgt für die Skalierung unter Beibehaltung des Seitenverhältnisses. Außerdem werden dem Bild Einrückungen hinzugefügt, falls das verkleinerte Bild mehr Breite als Höhe hat (oder umgekehrt).
quelle
Wenn Sie die Kontrolle über den Server haben, würde ich dringend empfehlen, die Größe der Bildserverseite mit ImageMagik zu ändern . Das Herunterladen und Ändern der Größe großer Bilder auf dem Telefon ist eine Verschwendung vieler wertvoller Ressourcen - Bandbreite, Akku und Speicher. All dies ist auf Telefonen selten.
quelle
Ich habe in Swift eine ultimative Lösung für die Bildskalierung entwickelt.
Sie können die Größe des Bilds so ändern, dass es die angegebene Größe füllt, füllt oder anpasst.
Sie können das Bild an der Mitte oder an einer der vier Kanten und vier Ecken ausrichten.
Außerdem können Sie zusätzlichen Platz kürzen, der hinzugefügt wird, wenn die Seitenverhältnisse von Originalbild und Zielgröße nicht gleich sind.
Im Folgenden finden Sie Beispiele für die Anwendung dieser Lösung.
Das graue Rechteck ist die Größe des Zielseitenbilds. Blaue Kreise im hellblauen Rechteck sind das Bild (ich habe Kreise verwendet, weil es leicht zu erkennen ist, wenn es skaliert ist, ohne den Aspekt beizubehalten). Die hellorange Farbe markiert Bereiche, die beim Passieren zugeschnitten werden
trim: true
.Aspektanpassung vor und nach der Skalierung:
Ein weiteres Beispiel für die Aspektanpassung :
Aspektanpassung mit oberer Ausrichtung:
Aspektfüllung :
Füllen :
In meinen Beispielen habe ich Upscaling verwendet, weil es einfacher zu demonstrieren ist, aber die Lösung funktioniert auch für das Downscaling wie in Frage.
Für die JPEG-Komprimierung sollten Sie Folgendes verwenden:
Sie können meinen Kern mit Xcode Spielplatz überprüfen .
quelle
Bei Swift 3 skaliert der folgende Code das Bild unter Beibehaltung des Seitenverhältnisses. Weitere Informationen zum ImageContext finden Sie in der Apple-Dokumentation :
Um es zu verwenden, rufen Sie die
resizeImage()
Methode auf:quelle
Mit diesem Code können Sie das Bild in der erforderlichen Größe skalieren.
quelle
Ein Problem, das bei Retina-Displays auftreten kann, besteht darin, dass der Maßstab des Bildes von ImageCapture oder so festgelegt wird. Die obigen Größenänderungsfunktionen ändern dies nicht. In diesen Fällen funktioniert die Größenänderung nicht ordnungsgemäß.
Im folgenden Code wird die Skalierung auf 1 gesetzt (nicht skaliert) und das zurückgegebene Bild hat die erwartete Größe. Dies wird in dem getan
UIGraphicsBeginImageContextWithOptions
Anruf.quelle
Ich habe mich hier für eine Lösung entschieden, deren Größe sich eher nach Dateigröße als nach Abmessungen ändert.
Dadurch werden sowohl die Abmessungen als auch die Qualität des Bildes reduziert, bis die angegebene Größe erreicht ist.
Gutschrift für die Skalierung nach Größenantwort
quelle
Schnelle Version
quelle
Laut dieser Sitzung, iOS Memory Deep Dive , sollten wir
ImageIO
Bilder besser verkleinern.Das Schlechte an der Verwendung von
UIImage
verkleinerten Bildern.Verwenden
ImageIO
ImageIO kann Bildgrößen und Metadateninformationen lesen, ohne den Speicher zu verschmutzen.
ImageIO kann die Größe von Bildern nur zum Preis der Bildgröße ändern.
Über Bild im Speicher
UIGraphicsBeginImageContextWithOptions
Verwendet immer dasSRGB
Rendering-Format, das 4 Bytes pro Pixel verwendet.load -> decode -> render
3 Phasen.UIImage
ist teuer für die Dimensionierung und GrößenänderungWenn Sie für das folgende Bild
UIGraphicsBeginImageContextWithOptions
nur 590 KB zum Laden eines Bildes benötigen, benötigen2048 pixels x 1536 pixels x 4 bytes per pixel
wir beim Dekodieren = 10 MBwährend
UIGraphicsImageRenderer
, 10 in iOS eingeführt, wird das beste Grafikformat in iOS12 automatisch auswählen. Es bedeutet, dass Sie 75% der Speicher sparen durch ErsetzenUIGraphicsBeginImageContextWithOptions
mit ,UIGraphicsImageRenderer
wenn Sie SRGB nicht brauchen.Dies ist mein Artikel über iOS-Bilder im Speicher
oder
quelle
Am Ende habe ich die Brads-Technik verwendet, um eine
scaleToFitWidth
Methode zu erstellen ,UIImage+Extensions
wenn dies für jemanden nützlich ist ...dann wo immer du willst
#import "UIImage+Extensions.h"
UIImage *newImage = [image scaleToFitWidth:100.0f];
UIView+Extensions
Erwähnenswert ist auch, dass Sie dies weiter nach unten in eine Klasse verschieben können, wenn Sie Bilder aus einer UIView rendern möchtenquelle
Ich wollte diese Frage nur für Cocoa Swift-Programmierer beantworten. Diese Funktion gibt NSImage mit neuer Größe zurück. Sie können diese Funktion so verwenden.
quelle
Wenn sich Ihr Bild im Dokumentverzeichnis befindet, fügen Sie diese URL- Erweiterung hinzu:
Verwendung:
Hinweis: - Ändern Sie <LocalImagePath.jpg> mit Ihrem lokalen JPG-Bildpfad.
quelle
Wenn jemand noch nach einer besseren Option sucht
quelle
quelle
Um die Größe eines Bildes zu ändern, habe ich bessere (grafische) Ergebnisse, wenn ich diese Funktion anstelle von DrawInRect verwende:
Das Seitenverhältnis wird automatisch berücksichtigt
quelle