dejix dejix - 10 months ago 342
Swift Question

How use CGContextDrawImage in Swift 3?

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 Source

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)