wake-up-neo.com

Swift 3 und CGContextDrawImage

Ich möchte diese Zeile in den aktuellen Syntaxcode von Swift 3 übersetzen, aber anscheinend gibt es einige Probleme:

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

Gemäß den CoreGraphics.apinotesCGContextDrawImage wurde in CGContext.draw konvertiert:

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

Wenn ich versuche zu tun:

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

Anscheinend gibt es eine einfache Syntax, die den Compiler stört, aber ich kann nicht sehen (tatsächlich erhalte ich einen typischen mehrdeutigen Fehler):

 enter image description here

Kann mir jemand mit diesem neuen Swift 3-Syntaxcode helfen?

17

Sie müssen es so aufrufen, als wäre es eine Instanzmethode von CGContext:

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

Überprüfen Sie die letzte Referenz von CGContext .

36
OOPer

Ich habe eine weitere sehr gute Lösung für dieses Problem gefunden, die ich derzeit verwende. Sie müssen das Bild nur als Argument an diese Methode übergeben, nachdem Sie das Bild mit UIImagePickerController aufgenommen haben. Es funktioniert gut für alle iOS-Versionen und auch für die Ausrichtung von Hoch- und Querformat von Camera. Es prüft die EXIF-Eigenschaft des Bildes mit UIImageOrientaiton und entsprechend dem Orientierungswert. Es transformiert und skaliert das Bild, so dass Sie dasselbe Rückkehrbild mit derselben Ausrichtung wie Ihre Kameraansicht erhalten.

Hier habe ich eine maximale Auflösung von 3000 beibehalten, sodass die Bildqualität nicht besonders während der Verwendung von Retina-Geräten beeinträchtigt wird, sondern Sie können die Auflösung entsprechend Ihrer Anforderungen ändern.

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!
    }
0
sajgan2015