Sfoglia il codice sorgente

refactor image compression chaos

cyberta 5 anni fa
parent
commit
e70c51e6fe

+ 1 - 1
deltachat-ios/Controller/ChatViewController.swift

@@ -883,7 +883,7 @@ extension ChatViewController: MessagesDataSource {
     private func sendImage(_ image: UIImage, message: String? = nil) {
         DispatchQueue.global().async {
             if let compressedImage = image.dcCompress() {
-                // at this point image is compressed by 85% by default
+                // at this point image is compressed by 50% by default
                 let pixelSize = compressedImage.imageSizeInPixel()
                 let path = Utils.saveImage(image: compressedImage)
                 let msg = DcMsg(viewType: DC_MSG_IMAGE)

+ 7 - 1
deltachat-ios/Extensions/UIImage+Extension.swift

@@ -76,13 +76,19 @@ extension UIImage {
         let rect = getResizedRectangle(toMax: toMax)
         //50 percent compression
         let compressionQuality: Float = 0.5
-        UIGraphicsBeginImageContext(rect.size)
+        UIGraphicsBeginImageContextWithOptions(rect.size, self.isTransparent(), 0.0)
         draw(in: rect)
         let img = UIGraphicsGetImageFromCurrentImageContext()
         let imageData = img?.jpegData(compressionQuality: CGFloat(compressionQuality))
         UIGraphicsEndImageContext()
         return UIImage(data: imageData!)
     }
+
+    public func isTransparent() -> Bool {
+        guard let alpha: CGImageAlphaInfo = self.cgImage?.alphaInfo else { return false }
+        return alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast
+      }
+
 }
 
 public enum ImageType: String {

+ 2 - 15
deltachat-ios/Helper/Utils.swift

@@ -119,27 +119,14 @@ struct Utils {
         return addressParts.joined(separator: ", ")
     }
 
+    // compression needs to be done before in UIImage.dcCompress()
     static func saveImage(image: UIImage) -> String? {
         guard let directory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask,
             appropriateFor: nil, create: false) as NSURL else {
             return nil
         }
 
-        let size = image.size.applying(CGAffineTransform(scaleX: 0.2, y: 0.2))
-        let hasAlpha = false
-        let scale: CGFloat = 0.0
-
-        UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
-        image.draw(in: CGRect(origin: CGPoint.zero, size: size))
-
-        let scaledImageI = UIGraphicsGetImageFromCurrentImageContext()
-        UIGraphicsEndImageContext()
-
-        guard let scaledImage = scaledImageI else {
-            return nil
-        }
-
-        guard let data = scaledImage.jpegData(compressionQuality: 0.9) else {
+        guard let data = image.jpegData(compressionQuality: 1.0) else {
             return nil
         }