Преглед изворни кода

Add fixing orientation to correct normalization

onevcat пре 6 година
родитељ
комит
1f64f8d108
3 измењених фајлова са 47 додато и 6 уклоњено
  1. 44 3
      Sources/Image/Image.swift
  2. 2 2
      Sources/Image/ImageDrawing.swift
  3. 1 1
      Sources/Utility/String+MD5.swift

+ 44 - 3
Sources/Image/Image.swift

@@ -124,9 +124,50 @@ extension KingfisherWrapper where Base: Image {
         guard images == nil else { return base }
         // No need to do anything if already up
         guard base.imageOrientation != .up else { return base }
-    
-        return draw(to: size) { _ in
-            base.draw(in: CGRect(origin: .zero, size: size))
+
+        return draw(to: size, inverting: true, refImage: Image()) {
+            fixOrientation(in: $0)
+        }
+    }
+
+    func fixOrientation(in context: CGContext) {
+
+        var transform = CGAffineTransform.identity
+
+        let orientation = base.imageOrientation
+
+        switch orientation {
+        case .down, .downMirrored:
+            transform = transform.translatedBy(x: size.width, y: size.height)
+            transform = transform.rotated(by: .pi)
+        case .left, .leftMirrored:
+            transform = transform.translatedBy(x: size.width, y: 0)
+            transform = transform.rotated(by: .pi / 2.0)
+        case .right, .rightMirrored:
+            transform = transform.translatedBy(x: 0, y: size.height)
+            transform = transform.rotated(by: .pi / -2.0)
+        case .up, .upMirrored:
+            break
+        }
+
+        //Flip image one more time if needed to, this is to prevent flipped image
+        switch orientation {
+        case .upMirrored, .downMirrored:
+            transform = transform.translatedBy(x: size.width, y: 0)
+            transform = transform.scaledBy(x: -1, y: 1)
+        case .leftMirrored, .rightMirrored:
+            transform = transform.translatedBy(x: size.height, y: 0)
+            transform = transform.scaledBy(x: -1, y: 1)
+        case .up, .down, .left, .right:
+            break
+        }
+
+        context.concatenate(transform)
+        switch orientation {
+        case .left, .leftMirrored, .right, .rightMirrored:
+            context.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.height, height: size.width))
+        default:
+            context.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
         }
     }
     #endif

+ 2 - 2
Sources/Image/ImageDrawing.swift

@@ -499,7 +499,7 @@ extension KingfisherWrapper where Base: Image {
         #endif
     }
     
-    func draw(to size: CGSize, inverting: Bool = false, scale: CGFloat? = nil, draw: (CGContext) -> Void) -> Image {
+    func draw(to size: CGSize, inverting: Bool = false, scale: CGFloat? = nil, refImage: Image? = nil, draw: (CGContext) -> Void) -> Image {
         let targetScale = scale ?? self.scale
         guard let context = beginContext(size: size, scale: targetScale, inverting: inverting) else {
             assertionFailure("[Kingfisher] Failed to create CG context for blurring image.")
@@ -510,7 +510,7 @@ extension KingfisherWrapper where Base: Image {
         guard let cgImage = context.makeImage() else {
             return base
         }
-        return KingfisherWrapper.image(cgImage: cgImage, scale: targetScale, refImage: base)
+        return KingfisherWrapper.image(cgImage: cgImage, scale: targetScale, refImage: refImage ?? base)
     }
     
     #if os(macOS)

+ 1 - 1
Sources/Utility/String+MD5.swift

@@ -2,7 +2,7 @@
 //  String+MD5.swift
 //  Kingfisher
 //
-//  Created by Wei Wang on 18//25.
+//  Created by Wei Wang on 18/09/25.
 //
 //  Copyright (c) 2019 Wei Wang <onevcat@gmail.com>
 //