В моем приложении пользователь выбирает изображение из библиотеки фотографий, а затем оно переходит в ячейку в ячейке коллекции. Ячейка содержит только ImageView. Когда изображение отображается, если это изображение, снятое передней камерой, оно поворачивается на 90 градусов вправо, если оно портретное, и на 180 градусов, если оно альбомное.
Я пробовал использовать это расширение, но оно не сработало. Также попытался изменить режим содержимого изображения на: заливка сторон, соответствие сторон, масштаб для заливки. Но ничего.
func fixedOrientation() -> UIImage? {
guard imageOrientation != UIImageOrientation.up else {
//This is default orientation, don't need to do anything
return self.copy() as? UIImage
}
guard let cgImage = self.cgImage else {
//CGImage is not available
return nil
}
guard let colorSpace = cgImage.colorSpace, let ctx = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: cgImage.bitsPerComponent, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else {
return nil //Not able to create CGContext
}
var transform: CGAffineTransform = CGAffineTransform.identity
switch imageOrientation {
case .down, .downMirrored:
transform = transform.translatedBy(x: size.width, y: size.height)
transform = transform.rotated(by: CGFloat.pi)
break
case .left, .leftMirrored:
transform = transform.translatedBy(x: size.width, y: 0)
transform = transform.rotated(by: CGFloat.pi / 2.0)
break
case .right, .rightMirrored:
transform = transform.translatedBy(x: 0, y: size.height)
transform = transform.rotated(by: CGFloat.pi / -2.0)
break
case .up, .upMirrored:
break
}
//Flip image one more time if needed to, this is to prevent flipped image
switch imageOrientation {
case .upMirrored, .downMirrored:
transform.translatedBy(x: size.width, y: 0)
transform.scaledBy(x: -1, y: 1)
break
case .leftMirrored, .rightMirrored:
transform.translatedBy(x: size.height, y: 0)
transform.scaledBy(x: -1, y: 1)
case .up, .down, .left, .right:
break
}
ctx.concatenate(transform)
switch imageOrientation {
case .left, .leftMirrored, .right, .rightMirrored:
ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.height, height: size.width))
default:
ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
break
}
guard let newCGImage = ctx.makeImage() else { return nil }
return UIImage.init(cgImage: newCGImage, scale: 1, orientation: .up)
}
да, вот что я делаю: let imageData: NSData = UIImagePNGRepresentation (image)! как NSData
PNG не имеет метаданных, поэтому он не учитывает ориентацию изображения. У вас есть два варианта. 1) сохраните его как jpeg, используя UIImageJPEGRepresentation (лучший вариант, учитывая окончательный размер изображения) 2) Сгладьте изображение, перерисовав его, как вы можете видеть в этом ответе stackoverflow.com/questions/42098390/…
@LeoDabus большое спасибо, он работает с jpeg!





Вы сохраняете изображения в формате PNG?