Swift: UIGraphicsImageRendererFormat instead of UIGraphicsBeginImageContext returning blank image

4.4k Views Asked by At

I'm replacing UIGraphicsBeginImageContext with UIGraphicsImageRendererFormat to optimize performance and modernize my code. For some reason, UIGraphicsImageRendererFormat is returning a blank image in my function. I must be doing something wrong!

Old function: (works fine)

func drawImageInRect(inputImage: UIImage, inRect imageRect: CGRect) -> UIImage {

    UIGraphicsBeginImageContext(self.size)
    self.draw(in:(CGRect(x:0.0, y:0.0, width:self.size.width, height:self.size.height)))
    inputImage.draw(in:(imageRect))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

New function: (draws nothing)

func drawImageInRect(inputImage: UIImage, inRect imageRect: CGRect) -> UIImage {


    let renderFormat = UIGraphicsImageRendererFormat.default()
    renderFormat.opaque = true
    let renderer = UIGraphicsImageRenderer(size: self.size, format: renderFormat)

    let scaledImage = renderer.image {
        (context) in
        inputImage.draw(in: imageRect)
    }
    return scaledImage
}
1

There are 1 best solutions below

11
rmaddy On

The problem is that in your updated function you forgot to draw self so you get a black background where the original image should be.

func drawImageInRect(inputImage: UIImage, inRect imageRect: CGRect) -> UIImage {
    let renderFormat = UIGraphicsImageRendererFormat.default()
    renderFormat.opaque = true
    let renderer = UIGraphicsImageRenderer(size: self.size, format: renderFormat)

    let scaledImage = renderer.image {
        (context) in
        // Add the following missing line
        self.draw(in:(CGRect(x:0.0, y:0.0, width:self.size.width, height:self.size.height)))
        inputImage.draw(in: imageRect)
    }
    return scaledImage
}