Browse Source

Improve animated image resizeing with Image/IO

xspyhack 6 years ago
parent
commit
b20bac43ef
2 changed files with 11 additions and 83 deletions
  1. 0 74
      Sources/Image/ImageDrawing.swift
  2. 11 9
      Sources/Views/AnimatedImageView.swift

+ 0 - 74
Sources/Image/ImageDrawing.swift

@@ -527,77 +527,3 @@ extension KingfisherWrapper where Base: Image {
     }
     }
     #endif
     #endif
 }
 }
-
-extension CGImage: KingfisherCompatible {}
-/// High Performance Image Resizing
-/// @see https://nshipster.com/image-resizing/
-extension KingfisherWrapper where Base: CGImage {
-    var size: CGSize {
-        return CGSize(width: CGFloat(base.width), height: CGFloat(base.height))
-    }
-
-    /// Resizes `base` CGImage to a CGImage of new size, respecting the given content mode.
-    ///
-    /// - Parameters:
-    ///   - targetSize: The target size in point.
-    ///   - contentMode: Content mode of output image should be.
-    /// - Returns: A CGImage with new size.
-    #if os(iOS) || os(tvOS)
-    public func resize(to size: CGSize, for contentMode: UIView.ContentMode) -> CGImage {
-        switch contentMode {
-        case .scaleAspectFit:
-            return resize(to: size, for: .aspectFit)
-        case .scaleAspectFill:
-            return resize(to: size, for: .aspectFill)
-        default:
-            return resize(to: size)
-        }
-    }
-    #endif
-
-    // MARK: - Resize
-    /// Resizes `base` CGImage to a CGImage with new size.
-    ///
-    /// - Parameter size: The target size in point.
-    /// - Returns: A CGImage with new size.
-    public func resize(to size: CGSize) -> CGImage {
-        let alphaInfo = base.alphaInfo.rawValue & CGBitmapInfo.alphaInfoMask.rawValue
-        var hasAlpha = false
-        if alphaInfo == CGImageAlphaInfo.premultipliedLast.rawValue
-            || alphaInfo == CGImageAlphaInfo.premultipliedFirst.rawValue
-            || alphaInfo == CGImageAlphaInfo.first.rawValue
-            || alphaInfo == CGImageAlphaInfo.last.rawValue {
-            hasAlpha = true
-        }
-
-        var bitmapInfo = CGImageByteOrderInfo.order32Little.rawValue
-        bitmapInfo |= hasAlpha ? CGImageAlphaInfo.premultipliedFirst.rawValue : CGImageAlphaInfo.noneSkipFirst.rawValue
-
-        guard let context = CGContext(data: nil,
-                                      width: Int(size.width),
-                                      height: Int(size.height),
-                                      bitsPerComponent: base.bitsPerComponent,
-                                      bytesPerRow: base.bytesPerRow,
-                                      space: base.colorSpace ?? CGColorSpaceCreateDeviceRGB(),
-                                      bitmapInfo: bitmapInfo) else
-        {
-            return base
-        }
-
-        let rect = CGRect(origin: .zero, size: size)
-        context.interpolationQuality = .high
-        context.draw(base, in: rect)
-        return context.makeImage() ?? base
-    }
-
-    /// Resizes `base` CGImage to a CGImage of new size, respecting the given content mode.
-    ///
-    /// - Parameters:
-    ///   - targetSize: The target size in point.
-    ///   - contentMode: Content mode of output image should be.
-    /// - Returns: A CGImage with new size.
-    public func resize(to targetSize: CGSize, for contentMode: ContentMode) -> CGImage {
-        let newSize = size.kf.resize(to: targetSize, for: contentMode)
-        return resize(to: newSize)
-    }
-}

+ 11 - 9
Sources/Views/AnimatedImageView.swift

@@ -488,18 +488,20 @@ extension AnimatedImageView {
         }
         }
 
 
         private func loadFrame(at index: Int) -> UIImage? {
         private func loadFrame(at index: Int) -> UIImage? {
-            guard let image = CGImageSourceCreateImageAtIndex(imageSource, index, nil) else {
+            let options: [CFString: Any] = [
+                kCGImageSourceCreateThumbnailFromImageIfAbsent: true,
+                kCGImageSourceCreateThumbnailWithTransform: true,
+                kCGImageSourceShouldCacheImmediately: true,
+                kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height)
+            ]
+
+            guard let cgImage = CGImageSourceCreateImageAtIndex(imageSource,
+                                                                index,
+                                                                needsPrescaling ? options as CFDictionary : nil) else {
                 return nil
                 return nil
             }
             }
 
 
-            let scaledImage: CGImage
-            if needsPrescaling, size != .zero {
-                scaledImage = image.kf.resize(to: size, for: contentMode)
-            } else {
-                scaledImage = image
-            }
-
-            return Image(cgImage: scaledImage)
+            return Image(cgImage: cgImage)
         }
         }
         
         
         private func updatePreloadedFrames() {
         private func updatePreloadedFrames() {