Skip to content

Commit f594cee

Browse files
author
zhanglong15
committed
Fix image orientation before edit. Optimize image compression method.
1 parent 871ae92 commit f594cee

File tree

13 files changed

+96
-4
lines changed

13 files changed

+96
-4
lines changed

Sources/Extensions/UIImage+ZLImageEditor.swift

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,62 @@ import Accelerate
2929

3030
extension UIImage {
3131

32+
// 修复转向
33+
func fixOrientation() -> UIImage {
34+
if self.imageOrientation == .up {
35+
return self
36+
}
37+
38+
var transform = CGAffineTransform.identity
39+
40+
switch self.imageOrientation {
41+
case .down, .downMirrored:
42+
transform = CGAffineTransform(translationX: self.size.width, y: self.size.height)
43+
transform = transform.rotated(by: .pi)
44+
45+
case .left, .leftMirrored:
46+
transform = CGAffineTransform(translationX: self.size.width, y: 0)
47+
transform = transform.rotated(by: CGFloat.pi / 2)
48+
49+
case .right, .rightMirrored:
50+
transform = CGAffineTransform(translationX: 0, y: self.size.height)
51+
transform = transform.rotated(by: -CGFloat.pi / 2)
52+
53+
default:
54+
break
55+
}
56+
57+
switch self.imageOrientation {
58+
case .upMirrored, .downMirrored:
59+
transform = transform.translatedBy(x: self.size.width, y: 0)
60+
transform = transform.scaledBy(x: -1, y: 1)
61+
62+
case .leftMirrored, .rightMirrored:
63+
transform = transform.translatedBy(x: self.size.height, y: 0)
64+
transform = transform.scaledBy(x: -1, y: 1)
65+
66+
default:
67+
break
68+
}
69+
70+
guard let ci = self.cgImage, let colorSpace = ci.colorSpace else {
71+
return self
72+
}
73+
let context = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height), bitsPerComponent: ci.bitsPerComponent, bytesPerRow: 0, space: colorSpace, bitmapInfo: ci.bitmapInfo.rawValue)
74+
context?.concatenate(transform)
75+
switch self.imageOrientation {
76+
case .left, .leftMirrored, .right, .rightMirrored:
77+
context?.draw(ci, in: CGRect(x: 0, y: 0, width: self.size.height, height: self.size.width))
78+
default:
79+
context?.draw(ci, in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
80+
}
81+
82+
guard let newCgimg = context?.makeImage() else {
83+
return self
84+
}
85+
return UIImage(cgImage: newCgimg)
86+
}
87+
3288
func rotate(orientation: UIImage.Orientation) -> UIImage {
3389
guard let imagRef = self.cgImage else {
3490
return self
@@ -247,6 +303,31 @@ extension UIImage {
247303
return UIImage(cgImage: cgImage)
248304
}
249305

306+
func compress(to maxSize: Int) -> UIImage {
307+
if let size = self.jpegData(compressionQuality: 1)?.count, size <= maxSize {
308+
return self
309+
}
310+
var min: CGFloat = 0
311+
var max: CGFloat = 1
312+
var data: Data?
313+
for _ in 0..<6 {
314+
let mid = (min + max) / 2
315+
data = self.jpegData(compressionQuality: mid)
316+
let compressSize = data?.count ?? 0
317+
if compressSize > maxSize {
318+
max = mid
319+
} else if compressSize < maxSize {
320+
min = mid
321+
} else {
322+
break
323+
}
324+
}
325+
guard let d = data else {
326+
return self
327+
}
328+
return UIImage(data: d) ?? self
329+
}
330+
250331
}
251332

252333

Sources/General/ZLEditImageViewController.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ public class ZLEditImageViewController: UIViewController {
203203
}
204204

205205
@objc init(image: UIImage, editModel: ZLEditImageModel? = nil) {
206-
self.originalImage = image
207-
self.editImage = image
206+
self.originalImage = image.fixOrientation()
207+
self.editImage = self.originalImage
208208
self.editRect = editModel?.editRect ?? CGRect(origin: .zero, size: image.size)
209209
self.drawColors = ZLImageEditorConfiguration.default().editImageDrawColors
210210
self.currentFilter = editModel?.selectFilter ?? .normal
@@ -678,8 +678,8 @@ public class ZLEditImageViewController: UIViewController {
678678
if hasEdit {
679679
resImage = self.buildImage()
680680
resImage = resImage.clipImage(self.angle, self.editRect) ?? resImage
681-
if let resizeImage = resImage.resize_vI(CGSize(width: resImage.size.width / 2, height: resImage.size.height / 2)) {
682-
resImage = resizeImage
681+
if let oriDataSize = self.originalImage.jpegData(compressionQuality: 1)?.count {
682+
resImage = resImage.compress(to: oriDataSize)
683683
}
684684
}
685685
self.editFinishBlock?(resImage, editModel)

Sources/ZLImageEditor.bundle/de.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Stornieren";
12
"done" = "Erledigt";
23
"editFinish" = "Fertig";
34
"revert" = "Rückgängig";

Sources/ZLImageEditor.bundle/en.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Cancel";
12
"done" = "Done";
23
"editFinish" = "Done";
34
"revert" = "Undo";

Sources/ZLImageEditor.bundle/fr.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Annuler";
12
"done" = "Terminé";
23
"editFinish" = "Terminé";
34
"revert" = "Annuler";

Sources/ZLImageEditor.bundle/it.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Annulla";
12
"done" = "Fine";
23
"editFinish" = "Fine";
34
"revert" = "Annulla";

Sources/ZLImageEditor.bundle/ja-US.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "キャンセル";
12
"done" = "確定";
23
"editFinish" = "完了";
34
"revert" = "元に戻す";

Sources/ZLImageEditor.bundle/ko.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "취소";
12
"done" = "끝난";
23
"editFinish" = "완료";
34
"revert" = "실행 취소";

Sources/ZLImageEditor.bundle/ms.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Batal";
12
"done" = "Selesai";
23
"editFinish" = "Selesai";
34
"revert" = "Buat asal";

Sources/ZLImageEditor.bundle/ru.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Отмена";
12
"done" = "Готово";
23
"editFinish" = "Готово";
34
"revert" = "Отменить";

Sources/ZLImageEditor.bundle/vi.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "Huỷ";
12
"done" = "Xong";
23
"editFinish" = "Xong";
34
"revert" = "Hoàn tác";

Sources/ZLImageEditor.bundle/zh-Hans.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "取消";
12
"done" = "确定";
23
"editFinish" = "完成";
34
"revert" = "还原";

Sources/ZLImageEditor.bundle/zh-Hant.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"cancel" = "取消";
12
"done" = "確定";
23
"editFinish" = "完成";
34
"revert" = "還原";

0 commit comments

Comments
 (0)