Quellcode durchsuchen

use a scaled down png in case an image has an alpha channel

cyberta vor 5 Jahren
Ursprung
Commit
f3e939a164
2 geänderte Dateien mit 14 neuen und 7 gelöschten Zeilen
  1. 13 6
      deltachat-ios/Extensions/UIImage+Extension.swift
  2. 1 1
      deltachat-ios/Helper/Utils.swift

+ 13 - 6
deltachat-ios/Extensions/UIImage+Extension.swift

@@ -71,15 +71,22 @@ extension UIImage {
         return newImage
         return newImage
     }
     }
 
 
-    // source: https://stackoverflow.com/questions/29137488/how-do-i-resize-the-uiimage-to-reduce-upload-image-size // slightly changed
+    // if an image has an alpha channel we try to keep it, using PNG formatting instead of JPEG
+    // PNGs are less compressed than JPEGs - to keep the message sizes small,
+    // the size of PNG imgaes will be scaled down
     func scaleDownAndCompress(toMax: Float) -> UIImage? {
     func scaleDownAndCompress(toMax: Float) -> UIImage? {
-        let rect = getResizedRectangle(toMax: toMax)
-        //50 percent compression
-        let compressionQuality: Float = 0.5
-        UIGraphicsBeginImageContextWithOptions(rect.size, self.isTransparent(), 0.0)
+        let rect = getResizedRectangle(toMax: self.isTransparent() ?
+            Float(min(self.size.width / 2, CGFloat(toMax / 2))) :
+            toMax)
+
+        UIGraphicsBeginImageContextWithOptions(rect.size, !self.isTransparent(), 0.0)
         draw(in: rect)
         draw(in: rect)
         let img = UIGraphicsGetImageFromCurrentImageContext()
         let img = UIGraphicsGetImageFromCurrentImageContext()
-        let imageData = img?.jpegData(compressionQuality: CGFloat(compressionQuality))
+
+        let imageData = self.isTransparent() ?
+            img?.pngData() :
+            img?.jpegData(compressionQuality: 0.5)
+
         UIGraphicsEndImageContext()
         UIGraphicsEndImageContext()
         return UIImage(data: imageData!)
         return UIImage(data: imageData!)
     }
     }

+ 1 - 1
deltachat-ios/Helper/Utils.swift

@@ -126,7 +126,7 @@ struct Utils {
             return nil
             return nil
         }
         }
 
 
-        guard let data = image.jpegData(compressionQuality: 1.0) else {
+        guard let data = image.isTransparent() ? image.pngData() : image.jpegData(compressionQuality: 1.0) else {
             return nil
             return nil
         }
         }