iOS: Foto schon beim Anlegen eines Produkts hinterlegen
Anlege-Formular bekommt eine Foto-Sektion (Kamera/Galerie) mit Vorschau. Das Bild wird nach dem Anlegen hochgeladen (dann gibt es eine Produkt-ID). Die JPEG-Aufbereitung ist jetzt eine freie Funktion (productImageJPEG), von der Detail- und Anlege-Ansicht gemeinsam genutzt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -196,7 +196,7 @@ struct ProductPhotoSection: View {
|
||||
}
|
||||
|
||||
private func upload(_ image: UIImage) async {
|
||||
guard let data = Self.prepared(image) else { return }
|
||||
guard let data = productImageJPEG(image) else { return }
|
||||
busy = true
|
||||
defer { busy = false }
|
||||
error = nil
|
||||
@@ -223,22 +223,24 @@ struct ProductPhotoSection: View {
|
||||
}
|
||||
}
|
||||
|
||||
/// Foto verkleinern und als JPEG unter die Server-Grenze (2 MB) drücken.
|
||||
private static func prepared(_ image: UIImage, maxDim: CGFloat = 1600) -> Data? {
|
||||
let size = image.size
|
||||
let scale = min(1, maxDim / max(size.width, size.height))
|
||||
let target = CGSize(width: size.width * scale, height: size.height * scale)
|
||||
let scaled = UIGraphicsImageRenderer(size: target).image { _ in
|
||||
image.draw(in: CGRect(origin: .zero, size: target))
|
||||
}
|
||||
var quality: CGFloat = 0.8
|
||||
var data = scaled.jpegData(compressionQuality: quality)
|
||||
while let d = data, d.count > 1_800_000, quality > 0.3 {
|
||||
quality -= 0.15
|
||||
data = scaled.jpegData(compressionQuality: quality)
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
/// Foto verkleinern und als JPEG unter die Server-Grenze (2 MB) drücken.
|
||||
/// Frei (nicht an eine View gebunden), damit auch das Anlege-Formular es nutzt.
|
||||
func productImageJPEG(_ image: UIImage, maxDim: CGFloat = 1600) -> Data? {
|
||||
let size = image.size
|
||||
let scale = min(1, maxDim / max(size.width, size.height))
|
||||
let target = CGSize(width: size.width * scale, height: size.height * scale)
|
||||
let scaled = UIGraphicsImageRenderer(size: target).image { _ in
|
||||
image.draw(in: CGRect(origin: .zero, size: target))
|
||||
}
|
||||
var quality: CGFloat = 0.8
|
||||
var data = scaled.jpegData(compressionQuality: quality)
|
||||
while let d = data, d.count > 1_800_000, quality > 0.3 {
|
||||
quality -= 0.15
|
||||
data = scaled.jpegData(compressionQuality: quality)
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
/// Kamera über UIImagePickerController – SwiftUI hat keine eigene Kamera-Ansicht.
|
||||
|
||||
Reference in New Issue
Block a user