Refer to the link

Like the 20 + MB rendering above

  • Set the UIImageView
Let imageView = UIImageView(frame: CGRect(x: 10.0, y: 74.0, width: (screenwith-20.0), height: ScreenWith (20.0))) imageView. BackgroundColor. = orange self. The addSubview (imageView)Copy the code
  • Scale the size of the ImageView
// Size is measured in point instead of pixel. To calculate the equivalent size of the image after you resize it, use the scale of the main UIScreen, Scale let screenScale = uiscreen.main. scale let Transform = CGAffineTransform(scaleX: screenScale, y: screenScale) let size = imageView.bounds.size.applying(transform)Copy the code
  • Render display images
DispatchQueue.global(qos: .default).async { let start = CACurrentMediaTime() guard let path = Bundle.main.path(forResource: "Viirs_3feb2012_lrg.jpg ", ofType: nil) else {fatalError(" failed to find resource ")} guard let url = bundle.main. url(forResource: "VIIRS_3Feb2012_lrg.jpg", withExtension: Else {fatalError(" bundle.main.url not found resource ")} // let image = UIImage(contentsOfFile: path) // let image = CoreGraphicsManager.imageRenderOfCoreGraphics(url: url, size: size) // CoreGraphics // let image = CoreImageManager.renderImageOfCoreImage(url: url, size: size) // let image = ImageIO.renderImage(url: url, size: size) // let image = ImageIO.renderImageWithHintingAndSubsampling(url: url, size: size) // let image = VImage.renderVImage(url: url, size: size) let image = self.renderImageWithUIKit(url: url, size: Size) dispatchqueue.main. async {let duration = 1.0 uiView. transition(with: imageView, duration: duration, options: [.curveEaseInOut,.transitionCrossDissolve]) { imageView.image = image } completion: {(result) in let end = CACurrentMediaTime() print(" time: \(end-start-duration)")}}}Copy the code
  • According to the code above, there are seven rendering methods, which are compared as follows
UIImage - Duration: 2.272907687998668 Memory 561MB CoreGraphics - Duration: 1.3122502480000549 Memory 16.2MB CoreImage - Duration: 2.272907687998668 5.254483673999857 memory 20MB ImageIO first mode: time: 1.0823896530000638 memory 15MB second mode: time: 1.0853783849997853 memory 15MB vImage - time: 2.418650589999743 memory 18MB UIGraphicsImageRenderer - time: 0.9039393570001266 15 MB memoryCopy the code
  • CoreGraphics
class CoreGraphicsManager: NSObject { static func imageRenderOfCoreGraphics(url:URL,size:CGSize) -> UIImage? { guard size ! =. Zero else {debugPrint (" photo size is not zero ") return nil} guard let imageSource = CGImageSourceCreateWithURL (url as CFURL, nil), let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) else { debugPrint("CGImageSourceCreate Error") return nil } let context = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: image.bitsPerComponent, bytesPerRow: image.bytesPerRow, space: image.colorSpace ?? CGColorSpace(name: CGColorSpace.sRGB)! , bitmapInfo: image.bitmapInfo.rawValue) context? .interpolationQuality = .high context?.draw(image, in: CGRect(origin: .zero, size: size)) guard let cgImage = context?.makeImage() else { debugPrint("cgImage nil") return nil } return UIImage(cgImage: cgImage) } }Copy the code
  • CoreImage
class CoreImageManager: NSObject { static let sharedContext = CIContext(options: [.useSoftwareRenderer : false]) static func renderImageOfCoreImage(url:URL,size:CGSize) -> UIImage? { precondition(size ! = .zero) guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any], let imageWidth = properties[kCGImagePropertyPixelWidth] as? CGFloat, let imageHeight = properties[kCGImagePropertyPixelHeight] as? CGFloat else { return nil } let scale = max(size.width, size.height) / max(imageWidth, imageHeight) guard scale >= 0, ! scale.isInfinite, ! scale.isNaN else { return nil } let aspectRatio = imageWidth / imageHeight guard aspectRatio >= 0, ! aspectRatio.isInfinite, ! aspectRatio.isNaN else { return nil } guard let image = CIImage(contentsOf: url) else { return nil } let filter = CIFilter(name: "CILanczosScaleTransform") filter? .setValue(image, forKey: kCIInputImageKey) filter? .setValue(scale, forKey: kCIInputScaleKey) filter? .setValue(aspectRatio, forKey: kCIInputAspectRatioKey) guard let outputCIImage = filter? .outputImage, let outputCGImage = sharedContext.createCGImage(outputCIImage, from: outputCIImage.extent) else { return nil } return UIImage(cgImage: outputCGImage) } }Copy the code
  • ImageIO
import MobileCoreServices class ImageIO: NSObject { static func renderImage(url:URL,size:CGSize) -> UIImage? { precondition(size ! = .zero) let options: [CFString: Any] = [ kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height), kCGImageSourceCreateThumbnailFromImageAlways: true, kCGImageSourceCreateThumbnailWithTransform: true ] guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), let image = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) else { return nil } return UIImage(cgImage: image) } static func renderImageWithHintingAndSubsampling(url:URL,size:CGSize) -> UIImage? { precondition(size ! = .zero) guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any], let imageWidth = properties[kCGImagePropertyPixelWidth] as? CGFloat, let imageHeight = properties[kCGImagePropertyPixelHeight] as? CGFloat else { return nil } var options: [CFString: Any] = [ kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height), kCGImageSourceCreateThumbnailFromImageAlways: true, kCGImageSourceCreateThumbnailWithTransform: true ] if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, url.pathExtension as CFString, kUTTypeImage)? .takeRetainedValue() { options[kCGImageSourceTypeIdentifierHint] = uti if uti == kUTTypeJPEG || uti == kUTTypeTIFF || uti == kUTTypePNG || String(uti).hasPrefix("public.heif") { switch min(imageWidth / size.width, imageHeight / size.height) { case ... 2.0: the options [kCGImageSourceSubsampleFactor] = 2.0 case 2.0... 4.0: the options [kCGImageSourceSubsampleFactor] = 4.0 case 4.0... : the options [kCGImageSourceSubsampleFactor] = 8.0 default: break } } } guard let image = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) else { return nil } return UIImage(cgImage: image) } }Copy the code
  • VImage
import Accelerate.vImage class VImage: NSObject { static func renderVImage(url:URL,size:CGSize) -> UIImage? { precondition(size ! = .zero) // Decode the source image guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil), let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any], let imageWidth = properties[kCGImagePropertyPixelWidth] as? vImagePixelCount, let imageHeight = properties[kCGImagePropertyPixelHeight] as? vImagePixelCount else { return nil } // Define the image format var format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue), version: 0, decode: nil, renderingIntent: .defaultIntent) var error: vImage_Error // Create and initialize the source buffer var sourceBuffer = vImage_Buffer() defer { sourceBuffer.data.deallocate() } error = vImageBuffer_InitWithCGImage(&sourceBuffer, &format, nil, image, vImage_Flags(kvImageNoFlags)) guard error == kvImageNoError else { return nil } // Create and initialize the destination  buffer var destinationBuffer = vImage_Buffer() error = vImageBuffer_Init(&destinationBuffer, vImagePixelCount(size.height), vImagePixelCount(size.width), format.bitsPerPixel, vImage_Flags(kvImageNoFlags)) guard error == kvImageNoError else { return nil } // Scale the image error = vImageScale_ARGB8888(&sourceBuffer, &destinationBuffer, nil, vImage_Flags(kvImageNoFlags)) guard error == kvImageNoError else { return nil } // Create a CGImage from the destination  buffer guard let resizedImage = vImageCreateCGImageFromBuffer(&destinationBuffer, &format, nil, nil, vImage_Flags(kvImageNoAllocate), &error)?.takeRetainedValue(), error == kvImageNoError else { return nil } return UIImage(cgImage: resizedImage) } }Copy the code
  • UIGraphicsImageRenderer
func renderImageWithUIKit(url:URL,size:CGSize) -> UIImage? {
        guard let image = UIImage(contentsOfFile: url.path) else {
            return nil
        }
        
        let renderer = UIGraphicsImageRenderer(size: size)
        return renderer.image { (context) in
            image.draw(in: CGRect(origin: .zero, size: size))
        }
}
Copy the code