Skip to content

Instantly share code, notes, and snippets.

@ppamorim
Created November 5, 2015 16:30
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ppamorim/cc79170422236d027b2b to your computer and use it in GitHub Desktop.
Save ppamorim/cc79170422236d027b2b to your computer and use it in GitHub Desktop.
Add padding/margin at a image!
import UIKit
extension UIImage {
func imageWithInsets(insetDimen: CGFloat) -> UIImage {
return imageWithInset(UIEdgeInsets(top: insetDimen, left: insetDimen, bottom: insetDimen, right: insetDimen))
}
func imageWithInset(insets: UIEdgeInsets) -> UIImage {
UIGraphicsBeginImageContextWithOptions(
CGSizeMake(self.size.width + insets.left + insets.right,
self.size.height + insets.top + insets.bottom), false, self.scale)
let origin = CGPoint(x: insets.left, y: insets.top)
self.drawAtPoint(origin)
let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return imageWithInsets
}
}
@pedro380085
Copy link

pedro380085 commented Oct 30, 2017

        UIGraphicsBeginImageContextWithOptions(CGSizeMake([outputImage extent].size.width * (1.0f + padding), [outputImage extent].size.height * (1.0f + padding)), NO, 1.0f);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
        CGContextFillRect(context, CGRectMake([outputImage extent].origin.x, [outputImage extent].origin.x, [outputImage extent].size.width * (1.0f + padding), [outputImage extent].size.height * (1.0f + padding)));
        CGContextDrawImage(context, CGRectMake([outputImage extent].size.width * padding * 0.5f, [outputImage extent].size.height * padding * 0.5f, [outputImage extent].size.width, [outputImage extent].size.height), cgImage);
        qrImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

@themakunga
Copy link

do you have it for swift 4?

@alapergola
Copy link

SWIFT 4 Version

extension UIImage {
    func imageWithInsets(insetDimen: CGFloat) -> UIImage {
        return imageWithInset(insets: UIEdgeInsets(top: insetDimen, left: insetDimen, bottom: insetDimen, right: insetDimen))
    }
    
    func imageWithInset(insets: UIEdgeInsets) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(
            CGSize(width: self.size.width + insets.left + insets.right,
                   height: self.size.height + insets.top + insets.bottom), false, self.scale)
        let origin = CGPoint(x: insets.left, y: insets.top)
        self.draw(at: origin)
        let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return imageWithInsets!
    }
    
}

@Wilsonilo
Copy link

Thanks for this, really helped me out.

@ened
Copy link

ened commented May 28, 2018

Ensure to copy the renderingMode of the original image.

extension UIImage {
    func imageWithInsets(insetDimen: CGFloat) -> UIImage {
        return imageWithInset(insets: UIEdgeInsets(top: insetDimen, left: insetDimen, bottom: insetDimen, right: insetDimen))
    }
    
    func imageWithInset(insets: UIEdgeInsets) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(
            CGSize(width: self.size.width + insets.left + insets.right,
                   height: self.size.height + insets.top + insets.bottom), false, self.scale)
        let origin = CGPoint(x: insets.left, y: insets.top)
        self.draw(at: origin)
        let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext()?.withRenderingMode(self.renderingMode)
        UIGraphicsEndImageContext()
        return imageWithInsets!
    }
    
}

@Starmel
Copy link

Starmel commented Jul 9, 2019

added self.scale for others screens

extension UIImage {

    func withInset(_ insets: UIEdgeInsets) -> UIImage? {
        let cgSize = CGSize(width: self.size.width + insets.left * self.scale + insets.right * self.scale,
                            height: self.size.height + insets.top * self.scale + insets.bottom * self.scale)

        UIGraphicsBeginImageContextWithOptions(cgSize, false, self.scale)
        defer { UIGraphicsEndImageContext() }

        let origin = CGPoint(x: insets.left * self.scale, y: insets.top * self.scale)
        self.draw(at: origin)

        return UIGraphicsGetImageFromCurrentImageContext()?.withRenderingMode(self.renderingMode)
    }
}

@dterekhov
Copy link

Solution using new UIGraphicsImageRenderer Apple API. Battle-tested 🙂

extension UIImage {
    
    func image(insets: UIEdgeInsets) -> UIImage? {
        let targetSize = CGSize(width: self.size.width + insets.left + insets.right,
                                height: self.size.height + insets.top + insets.bottom)
        let targetOrigin = CGPoint(x: insets.left, y: insets.top)
        
        let format = UIGraphicsImageRendererFormat()
        format.scale = 1
        let renderer = UIGraphicsImageRenderer(size: targetSize, format: format)
        
        return renderer.image { _ in
            self.draw(in: CGRect(origin: targetOrigin, size: self.size))
        }
    }
}

@0xMarK
Copy link

0xMarK commented Aug 4, 2021

@dterekhov you forgot about renderingMode and the correct scale. Here is a fully operational solution:

extension UIImage {
    
    func with(_ insets: UIEdgeInsets) -> UIImage {
        let targetWidth = size.width + insets.left + insets.right
        let targetHeight = size.height + insets.top + insets.bottom
        let targetSize = CGSize(width: targetWidth, height: targetHeight)
        let targetOrigin = CGPoint(x: insets.left, y: insets.top)
        let format = UIGraphicsImageRendererFormat()
        format.scale = scale
        let renderer = UIGraphicsImageRenderer(size: targetSize, format: format)
        return renderer.image { _ in
            draw(in: CGRect(origin: targetOrigin, size: size))
        }.withRenderingMode(renderingMode)
    }
    
}

@volkov-maxim
Copy link

@dterekhov you forgot about renderingMode and the correct scale. Here is a fully operational solution:

extension UIImage {
    
    func with(_ insets: UIEdgeInsets) -> UIImage {
        let targetWidth = size.width + insets.left + insets.right
        let targetHeight = size.height + insets.top + insets.bottom
        let targetSize = CGSize(width: targetWidth, height: targetHeight)
        let targetOrigin = CGPoint(x: insets.left, y: insets.top)
        let format = UIGraphicsImageRendererFormat()
        format.scale = scale
        let renderer = UIGraphicsImageRenderer(size: targetSize, format: format)
        return renderer.image { _ in
            draw(in: CGRect(origin: targetOrigin, size: size))
        }.withRenderingMode(renderingMode)
    }
    
}

Thank you! It very useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment