objective guide developer apple core-graphics swift3

core graphics - guide - Swift 3 y CGContextDrawImage



swift ios documentation (2)

Quiero traducir esta línea al código de sintaxis actual de Swift 3 pero parece que hay algunos problemas:

CGContextDrawImage(context, CGRect(x:0.0,y: 0.0,width: image!.size.width,height: image!.size.height), image!.cgImage)

De acuerdo con CGContextDrawImage se convirtió a CGContext.draw :

Name: CGContextDrawImage # replaced by draw(_ image: CGImage, in rect: CGRect, byTiling: Bool = false) SwiftName: CGContext.__draw(self:in:image:) SwiftPrivate: true

Cuando trato de hacer:

CGContext.draw(context as! CGImage, in: CGRect(x:0.0, y:0.0, width: image!.size.width, height: image!.size.height), byTiling: false)

Parece que hay una sintaxis simple que perturba el compilador pero no puedo ver (de hecho recibo un error ambiguo típico):

¿Puede alguien ayudarme con este nuevo código de sintaxis swift 3?


He encontrado otra muy buena solución para este problema que estoy usando actualmente. Solo debe pasar la imagen como un argumento a este método después de capturar la imagen con UIImagePickerController. Funciona bien para todas las versiones de iOS y también para la orientación vertical y horizontal de la cámara. Verifica la propiedad EXIF ​​de la imagen usando UIImageOrientaiton y de acuerdo con el valor de orientación, transforma y escala la imagen para que obtenga la misma imagen de retorno con la misma orientación que la orientación de vista de la cámara.

Aquí he guardado resoluciones máximas de 3000 para que la calidad de la imagen no se deteriore especialmente mientras utiliza dispositivos de retina, pero puede cambiar su resolución según sus necesidades.

func scaleAndRotateImage(image: UIImage, MaxResolution iIntMaxResolution: Int) -> UIImage { let kMaxResolution = iIntMaxResolution let imgRef = image.cgImage! let width: CGFloat = CGFloat(imgRef.width) let height: CGFloat = CGFloat(imgRef.height) var transform = CGAffineTransform.identity var bounds = CGRect.init(x: 0, y: 0, width: width, height: height) if Int(width) > kMaxResolution || Int(height) > kMaxResolution { let ratio: CGFloat = width / height if ratio > 1 { bounds.size.width = CGFloat(kMaxResolution) bounds.size.height = bounds.size.width / ratio } else { bounds.size.height = CGFloat(kMaxResolution) bounds.size.width = bounds.size.height * ratio } } let scaleRatio: CGFloat = bounds.size.width / width let imageSize = CGSize.init(width: CGFloat(imgRef.width), height: CGFloat(imgRef.height)) var boundHeight: CGFloat let orient = image.imageOrientation // The output below is limited by 1 KB. // Please Sign Up (Free!) to remove this limitation. switch orient { case .up: //EXIF = 1 transform = CGAffineTransform.identity case .upMirrored: //EXIF = 2 transform = CGAffineTransform.init(translationX: imageSize.width, y: 0.0) transform = transform.scaledBy(x: -1.0, y: 1.0) case .down: //EXIF = 3 transform = CGAffineTransform.init(translationX: imageSize.width, y: imageSize.height) transform = transform.rotated(by: CGFloat(Double.pi / 2)) case .downMirrored: //EXIF = 4 transform = CGAffineTransform.init(translationX: 0.0, y: imageSize.height) transform = transform.scaledBy(x: 1.0, y: -1.0) case .leftMirrored: //EXIF = 5 boundHeight = bounds.size.height bounds.size.height = bounds.size.width bounds.size.width = boundHeight transform = CGAffineTransform.init(translationX: imageSize.height, y: imageSize.width) transform = transform.scaledBy(x: -1.0, y: 1.0) transform = transform.rotated(by: CGFloat(Double.pi / 2) / 2.0) break default: print("Error in processing image") } UIGraphicsBeginImageContext(bounds.size) let context = UIGraphicsGetCurrentContext() if orient == .right || orient == .left { context?.scaleBy(x: -scaleRatio, y: scaleRatio) context?.translateBy(x: -height, y: 0) } else { context?.scaleBy(x: scaleRatio, y: -scaleRatio) context?.translateBy(x: 0, y: -height) } context?.concatenate(transform) context?.draw(imgRef, in: CGRect.init(x: 0, y: 0, width: width, height: height)) let imageCopy = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return imageCopy! }


CGContext llamarlo como si fuera un método de instancia de CGContext :

context.draw(image!.cgImage!, in: CGRect(x: 0.0,y: 0.0,width: image!.size.width,height: image!.size.height))

Compruebe la última referencia de CGContext .