In meiner iPhone-App mache ich ein Bild mit der Kamera und möchte es dann auf 290 * 390 Pixel verkleinern. Ich habe diese Methode verwendet, um die Größe des Bildes zu ändern:
UIImage *newImage = [image _imageScaledToSize:CGSizeMake(290, 390)
interpolationQuality:1];
Es funktioniert perfekt, ist aber eine undokumentierte Funktion, sodass ich es mit dem iPhone OS4 nicht mehr verwenden kann.
Also ... was ist der einfachste Weg, um die Größe eines UIImage zu ändern?
Antworten:
Der einfachste Weg ist, den Rahmen Ihres
UIImageView
und das einzustellencontentMode
eine der Größenänderungsoptionen festzulegen.Oder Sie können diese Dienstprogrammmethode verwenden, wenn Sie die Größe eines Bildes tatsächlich ändern müssen:
Anwendungsbeispiel:
quelle
newImage
wird bereits automatisch freigegeben, und es sollte bis zu der Methode, die dies aufgerufen hat, sein, es beizubehalten oder nicht. Dieser Ansatz bittet nur um einen Speicherfehler, da erinit
nicht Teil des Methodennamens ist. Ich würde erwarten, dass eine Methode mit diesem Namen ein automatisch freigegebenes Objekt zurückgibt.UIGraphicsBeginImageContextWithOptions
Hier ist eine Swift-Version von Paul Lynchs Antwort
Und als Erweiterung:
quelle
Richtig Swift 3.0 für iOS 10+ -Lösung: Verwenden
ImageRenderer
und Schließen der Syntax:Und hier ist die Objective-C-Version:
quelle
Trevor Howard hat einige UIImage-Kategorien , die die Größenänderung recht gut handhaben. Wenn nichts anderes, können Sie den Code als Beispiele verwenden.
Hinweis: Ab iOS 5.1 ist diese Antwort möglicherweise ungültig. Siehe Kommentar unten.
quelle
Eine kompaktere Version für Swift 4 und iOS 10+:
Verwendungszweck:
quelle
Ich habe dies auch gesehen (was ich
UIButtons
für den normalen und den ausgewählten Status verwende, da Schaltflächen dies nicht tunresize
passen). Der Kredit geht an den ursprünglichen Autor.Erstellen Sie zuerst eine leere .h- und .m-Datei mit dem Namen
UIImageResizing.h
undUIImageResizing.m
Fügen Sie diese .h-Datei in die .m-Datei ein, in der Sie die Funktion verwenden möchten, und rufen Sie sie dann folgendermaßen auf:
quelle
Diese Verbesserung des Paul-Codes liefert Ihnen ein scharfes hochauflösendes Bild auf einem iPhone mit Retina-Display. Andernfalls ist es beim Verkleinern verschwommen.
quelle
UIGraphicsBeginImageContextWithOptions
automatisch die Skalierung des Hauptbildschirms verwendet (ab iOS 3.2).Hier ist ein einfacher Weg:
resizedImage ist ein neues Bild.
quelle
Schnelle Lösung für Stretch Fill, Aspect Fill und Aspect Fit
und zur Verwendung können Sie Folgendes tun:
Vielen Dank an abdullahselek für seine ursprüngliche Lösung.
quelle
Hier ist eine Modifikation der Kategorie, die oben von iWasRobbed geschrieben wurde. Das Seitenverhältnis des Originalbilds bleibt erhalten, anstatt es zu verzerren.
quelle
Wenn Sie nur ein kleineres Bild wünschen und sich nicht für die genaue Größe interessieren:
Skalierung auf einstellen
0.25f
einstellen, erhalten Sie ein 816 x 612-Bild von einer 8-Megapixel-Kamera.Hier ist eine Kategorie UIImage + Scale für diejenigen, die eine benötigen.
quelle
Warum so kompliziert? Ich denke, mit der System-API kann das gleiche Ergebnis erzielt werden:
Das einzige Problem ist, dass Sie als zweites Argument die Umkehrung des Zielverhältnisses übergeben sollten, da der zweite Parameter laut Dokument das Verhältnis des Originalbilds zum neuen skalierten angibt.
quelle
Dies ist eine UIImage-Erweiterung, die mit Swift 3 und Swift 4 kompatibel ist und das Bild mit einem Seitenverhältnis auf die angegebene Größe skaliert
Anwendungsbeispiel
quelle
scaledImage(with size:)
oder zu benennenscaledWithSize(_:)
. AuchUIGraphicsGetImageFromCurrentImageContext
kann nicht wirklich zurückkehrennil
, also!
auch funktionieren würde. Sie können auch die direkte Erstellung vereinfachenCGRect(origin: .zero, size: size)
.Ich habe in Apples eigenen Beispielen eine Kategorie für UIImage gefunden, die den gleichen Trick macht. Hier ist der Link: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html .
Sie müssen nur den Anruf ändern:
in
imageWithImage:scaledToSize:inRect:
mit:Um den Alphakanal im Bild zu betrachten.
quelle
quelle
Für meine Xamarians-Kollegen gibt es hier eine Xamarin.iOS C # -Version der Antwort von @Paul Lynch.
quelle
Wenn Sie eine Miniaturansicht eines UIImage erstellen möchten (mit proportionaler Größenänderung oder möglicherweise etwas Zuschneiden), lesen Sie die Kategorie UIImage + Größe ändern , mit der Sie eine präzise , ImageMagick-ähnliche Syntax verwenden können:
quelle
[vgl. Chris] So ändern Sie die Größe auf die gewünschte Größe:
oder gleichwertig ersetzen
CGImageGetWidth(...)/DESIREDWIDTH
quelle
Rogerio Chaves antwortet als schnelle Erweiterung
Und auch Bonus
quelle
Swift 3.0 mit ausfallsicherer Option (gibt im Fehlerfall das Originalbild zurück):
quelle
(Swift 4-kompatibel) iOS 10+ und iOS <10-Lösung (
UIGraphicsImageRenderer
wenn möglich,UIGraphicsGetImageFromCurrentImageContext
andernfalls verwenden)quelle
Effektiver Ansatz ohne Bilddehnung Swift 4
// Methode aufrufen
quelle
Die Antwort von @Paul Lynch ist großartig, würde aber das Bildverhältnis ändern. Wenn Sie das Bildverhältnis nicht ändern möchten und das neue Bild dennoch für eine neue Größe geeignet sein soll, versuchen Sie dies.
quelle
Verwenden Sie diese Erweiterung
quelle
Swift 2.0:
quelle
Hier mein etwas ausführlicher Swift-Code
quelle
guard
deraspectRatioAwareSize
Funktion eine Vorbedingung ( ) hinzufügen , damit keine Ausnahme durch eine Division durch Null ausgelöst wird, wenn die Eingabeparameter für imageSize oder boxSizeCGSize.zero
Swift 4 Antwort:
quelle
The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
Ich habe festgestellt, dass es schwierig ist, eine Antwort zu finden, die Sie sofort in Ihrem Swift 3- Projekt verwenden können. Das Hauptproblem anderer Antworten ist, dass sie den Alpha-Kanal des Bildes nicht berücksichtigen. Hier ist die Technik, die ich in meinen Projekten verwende.
Anwendungsbeispiel:
Dieser Code ist eine Neufassung der Apple-Erweiterung mit zusätzlicher Unterstützung für Bilder mit und ohne Alphakanal.
Als weitere Lektüre empfehle ich, diesen Artikel auf verschiedene Techniken zur Größenänderung von Bildern zu überprüfen . Der derzeitige Ansatz bietet eine anständige Leistung, arbeitet mit APIs auf hoher Ebene und ist leicht zu verstehen. Ich empfehle, daran festzuhalten, es sei denn, Sie stellen fest, dass die Größenänderung von Bildern einen Engpass in Ihrer Leistung darstellt.
quelle
Verwenden Sie diese Erweiterung, falls Sie die Größe von Breite / Höhe nur mit dem Seitenverhältnis ändern müssen.
quelle