How use CGContextDrawImage in Swift 3?

dejix picture dejix · Sep 29, 2016 · Viewed 7.1k times · Source

I have an UIImage extension that uses CGContextDrawImage. It simply rotate a UIImage. I updated to Xcode8 and Swift3 and cant figure out how to use CGContextDrawImage.

I got error on CGContextDrawImage.

"Cannot convert value of type "CGImage.Type to expected argument type 'CGImage?'"

My code is :

CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)

And whole extension :

extension UIImage {
public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage {
    let radiansToDegrees: (CGFloat) -> CGFloat = {
        return $0 * (180.0 / CGFloat(M_PI))
    }
    let degreesToRadians: (CGFloat) -> CGFloat = {
        return $0 / 180.0 * CGFloat(M_PI)
    }

    // calculate the size of the rotated view's containing box for our drawing space
    let rectZero = CGPoint(dictionaryRepresentation: CGRect.zero as! CFDictionary)
    let rotatedViewBox = UIView(frame: CGRect(origin: rectZero!, size: size))
    let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()

    // Move the origin to the middle of the image so we will rotate and scale around the center.
    bitmap!.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0);

    //   // Rotate the image context
    bitmap!.rotate(by: degreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat

    if(flip){
        yFlip = CGFloat(-1.0)
    } else {
        yFlip = CGFloat(1.0)
    }

    bitmap!.scaleBy(x: yFlip, y: -1.0)

    CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
}
}

Answer

OOPer picture OOPer · Sep 29, 2016

In Swift 3, many functions for CGContext are imported as an instance method of CGContext, the property name CGImage has renamed to cgImage. And CGRectMake is removed.

Try this:

    bitmap!.draw(cgImage!, in: CGRect(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))

(Hope ! would be safe for your usage.)

func draw(CGImage, in: CGRect, byTiling: Bool)