Pracuję nad dodaniem obsługi zdjęć kolorowych w iOS 10. Gdy użytkownik robi zdjęcie z aparatu, muszę użyć nowego interfejsu API obsługującego nową przestrzeń kolorów, aby zapisać dane zdjęć - UIGraphicsImageRenderer
's jpegData
zamiast UIImageJPEGRepresentation
.Zastępowanie UIImageJPEGReprezentacja za pomocą jpegData UIGraphicsImageRenderer
Występują pewne problemy z orientacją obrazu. Wykonując zdjęcie na moim iPadzie w pozycji pionowej, obraz nie jest prawidłowo rysowany. Zobacz komentarze poniżej:
Starego API:
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let imageData = UIImageJPEGRepresentation(image, 1)
Nowe API:
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let cgImage = image.cgImage!
let ciImage = CIImage(cgImage: cgImage)
let format = UIGraphicsImageRendererFormat()
format.scale = 1
format.prefersExtendedRange = true
let renderer = UIGraphicsImageRenderer(bounds: ciImage.extent, format: format)
let imageData = renderer.jpegData(withCompressionQuality: 1, actions: { context in
context.cgContext.draw(cgImage, in: ciImage.extent) //draws flipped horizontally
//image.draw(at: .zero) //draws rotated 90 degrees leaving black at bottom
//image.draw(in: ciImage.extent) //draws rotated 90 degrees stretching and compressing the image to fill the rect
})
Co znajduje się w poprawny sposób zastąpić UIImageJPEGRepresentation
z UIGraphicsImageRenderer
„s jpegData
?
Czy to naprawdę cały kod, którego użyłeś? Metoda 'image.draw' powinna" rysować cały obraz w aktualnym kontekście graficznym, z zachowaniem ustawienia orientacji obrazu ". Z mojego doświadczenia wynika, że obrazy wejściowe zorientowane na działanie inne niż Up są zawsze ponownie renderowane do danych obrazu zorientowanego na Up przy użyciu renderera bez dodatkowej transformacji współrzędnych. – HuaTham