forked from ParisiLabs/wire-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUIImage+Preview.swift
80 lines (67 loc) · 3.84 KB
/
UIImage+Preview.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//
// Wire
// Copyright (C) 2016 Wire Swiss GmbH
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
import UIKit
import ImageIO
extension UIImage {
class func loadPreviewForImageWithURL(_ imageURL: URL, maxPixelSize previewImagePixelSize:Int, completion:@escaping (_ previewImage: UIImage?) -> Void) {
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async {
guard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, nil),
let imagePropertiesRef = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil)
else { return }
let imageProperties = imagePropertiesRef as NSDictionary
guard let imageWidth = (imageProperties[String(kCGImagePropertyPixelWidth)] as? NSNumber)?.floatValue,
let imageHeight = (imageProperties[String(kCGImagePropertyPixelHeight)] as? NSNumber)?.floatValue
else { return }
var orientation = UIImageOrientation.up
if let imageCGOrientation = (imageProperties[String(kCGImagePropertyOrientation)] as? NSNumber)?.uint32Value,
let imagePropertyOrientation = CGImagePropertyOrientation(rawValue: imageCGOrientation),
let imageUIOrientation = UIImageOrientation.fromCGImageOrientation(imagePropertyOrientation) {
orientation = imageUIOrientation
}
let aspectRatio = (imageWidth > imageHeight) ? imageWidth / imageHeight : imageHeight / imageWidth
let maxPixelSize = aspectRatio * Float(previewImagePixelSize)
let options: [AnyHashable: Any] =
[
kCGImageSourceThumbnailMaxPixelSize as AnyHashable: maxPixelSize,
kCGImageSourceCreateThumbnailFromImageIfAbsent as AnyHashable: true,
]
guard let thumbnailCGImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary?)
else { return }
let thumbnailImage = UIImage(cgImage: thumbnailCGImage, scale:1.0, orientation: orientation)
DispatchQueue.main.async {
completion(thumbnailImage)
}
}
}
}
extension UIImageOrientation {
static func fromCGImageOrientation(_ orientation:CGImagePropertyOrientation) -> UIImageOrientation? {
let imageOrientationMapping: Dictionary<UInt32, UIImageOrientation> =
[
CGImagePropertyOrientation.up.rawValue : UIImageOrientation.up,
CGImagePropertyOrientation.upMirrored.rawValue : UIImageOrientation.upMirrored,
CGImagePropertyOrientation.down.rawValue : UIImageOrientation.down,
CGImagePropertyOrientation.downMirrored.rawValue : UIImageOrientation.downMirrored,
CGImagePropertyOrientation.leftMirrored.rawValue : UIImageOrientation.rightMirrored,
CGImagePropertyOrientation.right.rawValue : UIImageOrientation.right,
CGImagePropertyOrientation.rightMirrored.rawValue: UIImageOrientation.leftMirrored,
CGImagePropertyOrientation.left.rawValue : UIImageOrientation.left,
]
return imageOrientationMapping[orientation.rawValue]
}
}