Ich habe versucht, eine Bilddatei auf Parse hochzuladen, nachdem ich das Foto direkt am Telefon aufgenommen habe. Aber es wirft eine Ausnahme:
Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInvalidArgumentException', Grund: 'PFFile darf nicht größer als 10485760 Byte sein'
Hier ist mein Code:
In der ersten Ansicht Controller:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "getImage")
{
var svc = segue.destinationViewController as! ClothesDetail
svc.imagePassed = imageView.image
}
}
In View Controller, der das Bild hochlädt:
let imageData = UIImagePNGRepresentation(imagePassed)
let imageFile = PFFile(name: "\(picName).png", data: imageData)
var userpic = PFObject(className:"UserPic")
userpic["picImage"] = imageFile`
Aber ich muss das Foto noch auf Parse hochladen. Gibt es eine Möglichkeit, die Größe oder Auflösung des Bildes zu reduzieren?
ios
swift
parse-platform
uiimage
elvislkm
quelle
quelle
Antworten:
Ja, Sie können
UIImageJPEGRepresentation
anstelle von verwendenUIImagePNGRepresentation
, um die Größe Ihrer Bilddatei zu reduzieren. Sie können einfach eine Erweiterung UIImage wie folgt erstellen:Xcode 8.2 • Swift 3.0.2
bearbeiten / aktualisieren:
Xcode 10 Swift 4.2
Verwendung:
quelle
UIImageJPEGRepresentation(yourImage, 1.0)
anstatt nur zu tippen,.jp
und xcode die Methode für Sie automatisch vervollständigen lassen. Gleiches gilt für die Komprimierungsaufzählung.whatever
.Wenn Sie die Bildgröße auf einen konkreten Wert beschränken möchten, können Sie Folgendes tun:
quelle
if let data = bits.representation(using: .jpeg, properties: [.compressionFactor:compressingValue])
quelle
Jus Fixing für Xcode 7, getestet am 21.09.2015 und funktioniert einwandfrei:
Erstellen Sie einfach eine Erweiterung
UIImage
wie folgt:Dann können Sie es so verwenden:
quelle
Swift 4 Binary Approach zum Komprimieren von Bildern
Ich glaube, es ist ziemlich spät, diese Frage zu beantworten, aber hier ist meine Lösung für die Frage, die optimiert ist. Ich verwende die binäre Suche , um den optimalen Wert zu finden. Wenn beispielsweise ein normaler Subtraktionsansatz zum Erreichen von 62% 38 Komprimierungsversuche erfordern würde, würde der Ansatz der * binären Suche ** die erforderliche Lösung in max log (100) = etwa 7 Versuchen erreichen.
Ich möchte Sie jedoch auch darüber informieren, dass sich die
UIImageJPEGRepresentation
Funktion nicht linear verhält, insbesondere wenn die Zahl nahe 1 liegt. Hier ist der Screenshot, in dem wir sehen können, dass das Bild nicht mehr komprimiert wird, nachdem der Gleitkommawert> 0,995 ist. Das Verhalten ist ziemlich unvorhersehbar, daher ist es besser, einen Delta-Puffer zu haben, der solche Fälle behandelt.Hier ist der Code dafür
quelle
for i in 0...13
.Das ist mit
UIImage
Erweiterung sehr einfachbenutzen
quelle
Swift 4.2 Update . Ich habe diese Erweiterung erstellt, um die UIImage-Größe zu reduzieren.
Hier haben Sie zwei Methoden, die erste nimmt einen Prozentsatz und die zweite reduziert das Bild auf 1 MB.
Natürlich können Sie die zweite Methode in 1 KB oder eine beliebige Größe ändern.
quelle
In Swift 5 als @Thiago Arreguy Antwort:
Und Sie können so anrufen:
quelle
In Swift
quelle
Swift 3
@ Leo-Dabus Antwort für schnelle 3 überarbeitet
quelle
In Swift 4 habe ich diese Erweiterung erstellt, die die erwartete Größe erhält und versucht, sie zu erreichen.
Benutzen
quelle
Die Verwendung
func jpegData(compressionQuality: CGFloat) -> Data?
funktioniert gut, wenn Sie nicht auf eine bestimmte Größe komprimieren müssen. Für bestimmte Bilder finde ich es jedoch nützlich, unter einer bestimmten Dateigröße komprimieren zu können. In diesem Fall,jpegData
ist dies unzuverlässig, und das iterative Komprimieren eines Bildes führt zu einem Plateau der Dateigröße (und kann sehr teuer sein). Stattdessen ziehe ich es vor, die Größe des UIImage selbst zu reduzieren, dann in jpegData zu konvertieren und zu überprüfen, ob die reduzierte Größe unter dem von mir gewählten Wert liegt (innerhalb einer von mir festgelegten Fehlergrenze). Ich passe den Multiplikator für den Komprimierungsschritt basierend auf dem Verhältnis der aktuellen Dateigröße zur gewünschten Dateigröße an, um die ersten Iterationen zu beschleunigen, die am teuersten sind.Swift 5
Und Verwendung:
Die UIImage-
resized
Erweiterung stammt von: Wie kann ich die Größe des UIImage ändern, um die Größe des Upload-Bildes zu verringern?quelle