From 26c6c4fbb4793bef68d44a2e085474ab125100d8 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 26 Jan 2016 18:12:27 +0800 Subject: [PATCH 1/8] use NSURLSessionDataTask instead of NSURLSessionDownloadTask for YepDownloader; progress --- Yep/Services/YepDownloader.swift | 77 +++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index b9354b6c..62b11509 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -47,12 +47,13 @@ class YepDownloader: NSObject { struct ProgressReporter { struct Task { - let downloadTask: NSURLSessionDownloadTask + let downloadTask: NSURLSessionDataTask typealias FinishedAction = NSData -> Void let finishedAction: FinishedAction let progress = NSProgress() + let tempData = NSMutableData() } let tasks: [Task] var finishedTasksCount = 0 @@ -91,14 +92,17 @@ class YepDownloader: NSObject { let messageID = message.messageID let mediaType = message.mediaType - var attachmentDownloadTask: NSURLSessionDownloadTask? + var attachmentDownloadTask: NSURLSessionDataTask? var attachmentFinishedAction: ProgressReporter.Task.FinishedAction? let attachmentURLString = message.attachmentURLString if !attachmentURLString.isEmpty && message.localAttachmentName.isEmpty, let URL = NSURL(string: attachmentURLString) { - attachmentDownloadTask = sharedDownloader.session.downloadTaskWithURL(URL) + attachmentDownloadTask = sharedDownloader.session.dataTaskWithURL(URL) +// attachmentDownloadTask = sharedDownloader.session.dataTaskWithURL(URL, completionHandler: { (data, response, error) -> Void in +// print("YepDownloader final data.lenght: \(data!.length)") +// }) attachmentFinishedAction = { data in @@ -152,7 +156,7 @@ class YepDownloader: NSObject { } } - var thumbnailDownloadTask: NSURLSessionDownloadTask? + var thumbnailDownloadTask: NSURLSessionDataTask? var thumbnailFinishedAction: ProgressReporter.Task.FinishedAction? if mediaType == MessageMediaType.Video.rawValue { @@ -161,7 +165,7 @@ class YepDownloader: NSObject { if !thumbnailURLString.isEmpty && message.localThumbnailName.isEmpty, let URL = NSURL(string: thumbnailURLString) { - thumbnailDownloadTask = sharedDownloader.session.downloadTaskWithURL(URL) + thumbnailDownloadTask = sharedDownloader.session.dataTaskWithURL(URL) thumbnailFinishedAction = { data in @@ -218,7 +222,7 @@ class YepDownloader: NSObject { class func downloadDataFromURL(URL: NSURL, reportProgress: ProgressReporter.ReportProgress?, finishedAction: ProgressReporter.Task.FinishedAction) { - let downloadTask = sharedDownloader.session.downloadTaskWithURL(URL) + let downloadTask = sharedDownloader.session.dataTaskWithURL(URL) let task = ProgressReporter.Task(downloadTask: downloadTask, finishedAction: finishedAction) let progressReporter = ProgressReporter(tasks: [task], reportProgress: reportProgress) @@ -232,6 +236,65 @@ extension YepDownloader: NSURLSessionDelegate { } +extension YepDownloader: NSURLSessionDataDelegate { + + private func reportProgressAssociatedWithDownloadTask(downloadTask: NSURLSessionDataTask, totalBytes: Int64) { + + for progressReporter in progressReporters { + + for i in 0.. Bool { + + for progressReporter in progressReporters { + + for i in 0.. Void) { + print("YepDownloader begin, expectedContentLength:\(response.expectedContentLength)") + reportProgressAssociatedWithDownloadTask(dataTask, totalBytes: response.expectedContentLength) + completionHandler(.Allow) + } + + func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { + print("YepDownloader data.length: \(data.length)") + + let finish = reportProgressAssociatedWithDownloadTask(dataTask, didReceiveDataBytes: Int64(data.length)) + + if finish { + print("finish") + } + } +} + +/* extension YepDownloader: NSURLSessionDownloadDelegate { private func handleData(data: NSData, ofDownloadTask downloadTask: NSURLSessionDownloadTask) { @@ -300,4 +363,4 @@ extension YepDownloader: NSURLSessionDownloadDelegate { reportProgressAssociatedWithDownloadTask(downloadTask, totalBytesWritten: totalBytesWritten, totalBytesExpectedToWrite: totalBytesExpectedToWrite) } } - +*/ From 83e7b8dfc2d2ba2ba3d39621475b88f53dacf11e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 27 Jan 2016 09:30:53 +0800 Subject: [PATCH 2/8] append tempData; finishDownloadTask --- Yep/Services/YepDownloader.swift | 36 +++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index 62b11509..e359f61e 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -100,9 +100,6 @@ class YepDownloader: NSObject { if !attachmentURLString.isEmpty && message.localAttachmentName.isEmpty, let URL = NSURL(string: attachmentURLString) { attachmentDownloadTask = sharedDownloader.session.dataTaskWithURL(URL) -// attachmentDownloadTask = sharedDownloader.session.dataTaskWithURL(URL, completionHandler: { (data, response, error) -> Void in -// print("YepDownloader final data.lenght: \(data!.length)") -// }) attachmentFinishedAction = { data in @@ -256,7 +253,7 @@ extension YepDownloader: NSURLSessionDataDelegate { } } - private func reportProgressAssociatedWithDownloadTask(downloadTask: NSURLSessionDataTask, didReceiveDataBytes: Int64) -> Bool { + private func reportProgressAssociatedWithDownloadTask(downloadTask: NSURLSessionDataTask, didReceiveData data: NSData) -> Bool { for progressReporter in progressReporters { @@ -264,7 +261,9 @@ extension YepDownloader: NSURLSessionDataDelegate { if downloadTask == progressReporter.tasks[i].downloadTask { + let didReceiveDataBytes = Int64(data.length) progressReporter.tasks[i].progress.completedUnitCount += didReceiveDataBytes + progressReporter.tasks[i].tempData.appendData(data) progressReporter.reportProgress?(progressReporter.totalProgress) @@ -277,6 +276,31 @@ extension YepDownloader: NSURLSessionDataDelegate { return false } + private func finishDownloadTask(downloadTask: NSURLSessionDataTask) { + + for i in 0.. Void) { print("YepDownloader begin, expectedContentLength:\(response.expectedContentLength)") reportProgressAssociatedWithDownloadTask(dataTask, totalBytes: response.expectedContentLength) @@ -286,10 +310,12 @@ extension YepDownloader: NSURLSessionDataDelegate { func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { print("YepDownloader data.length: \(data.length)") - let finish = reportProgressAssociatedWithDownloadTask(dataTask, didReceiveDataBytes: Int64(data.length)) + let finish = reportProgressAssociatedWithDownloadTask(dataTask, didReceiveData: data) if finish { print("finish") + + finishDownloadTask(dataTask) } } } From 18c1b57e54b8ec5b6bf013f2560f9f3cf7344aa3 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 27 Jan 2016 10:10:27 +0800 Subject: [PATCH 3/8] imageSource; imageTransform --- Yep/Caches/ImageCache.swift | 3 +++ Yep/Services/YepDownloader.swift | 31 +++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Yep/Caches/ImageCache.swift b/Yep/Caches/ImageCache.swift index 64f6cf79..2b639ce5 100644 --- a/Yep/Caches/ImageCache.swift +++ b/Yep/Caches/ImageCache.swift @@ -218,6 +218,9 @@ class ImageCache { completion(loadingProgress: progress, image: nil) } + }, imageTransform: { image in + return image.bubbleImageWithTailDirection(tailDirection, size: size).decodedImage() + }, imageFinished: { image in let messageImage = image.bubbleImageWithTailDirection(tailDirection, size: size).decodedImage() diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index e359f61e..ed7f36b8 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -8,6 +8,7 @@ import Foundation import RealmSwift +import ImageIO class YepDownloader: NSObject { @@ -54,6 +55,8 @@ class YepDownloader: NSObject { let progress = NSProgress() let tempData = NSMutableData() + let imageSource = CGImageSourceCreateIncremental(nil) + let imageTransform: (UIImage -> UIImage)? } let tasks: [Task] var finishedTasksCount = 0 @@ -78,10 +81,10 @@ class YepDownloader: NSObject { var progressReporters = [ProgressReporter]() class func downloadAttachmentsOfMessage(message: Message, reportProgress: ProgressReporter.ReportProgress?) { - downloadAttachmentsOfMessage(message, reportProgress: reportProgress, imageFinished: nil) + downloadAttachmentsOfMessage(message, reportProgress: reportProgress, imageTransform: nil, imageFinished: nil) } - class func downloadAttachmentsOfMessage(message: Message, reportProgress: ProgressReporter.ReportProgress?, imageFinished: (UIImage -> Void)?) { + class func downloadAttachmentsOfMessage(message: Message, reportProgress: ProgressReporter.ReportProgress?, imageTransform: (UIImage -> UIImage)?, imageFinished: (UIImage -> Void)?) { let downloadState = message.downloadState @@ -197,11 +200,11 @@ class YepDownloader: NSObject { var tasks: [ProgressReporter.Task] = [] if let attachmentDownloadTask = attachmentDownloadTask, attachmentFinishedAction = attachmentFinishedAction { - tasks.append(ProgressReporter.Task(downloadTask: attachmentDownloadTask, finishedAction: attachmentFinishedAction)) + tasks.append(ProgressReporter.Task(downloadTask: attachmentDownloadTask, finishedAction: attachmentFinishedAction, imageTransform: imageTransform)) } if let thumbnailDownloadTask = thumbnailDownloadTask, thumbnailFinishedAction = thumbnailFinishedAction { - tasks.append(ProgressReporter.Task(downloadTask: thumbnailDownloadTask, finishedAction: thumbnailFinishedAction)) + tasks.append(ProgressReporter.Task(downloadTask: thumbnailDownloadTask, finishedAction: thumbnailFinishedAction, imageTransform: imageTransform)) } if tasks.count > 0 { @@ -220,7 +223,7 @@ class YepDownloader: NSObject { class func downloadDataFromURL(URL: NSURL, reportProgress: ProgressReporter.ReportProgress?, finishedAction: ProgressReporter.Task.FinishedAction) { let downloadTask = sharedDownloader.session.dataTaskWithURL(URL) - let task = ProgressReporter.Task(downloadTask: downloadTask, finishedAction: finishedAction) + let task = ProgressReporter.Task(downloadTask: downloadTask, finishedAction: finishedAction, imageTransform: nil) let progressReporter = ProgressReporter(tasks: [task], reportProgress: reportProgress) sharedDownloader.progressReporters.append(progressReporter) @@ -267,8 +270,24 @@ extension YepDownloader: NSURLSessionDataDelegate { progressReporter.reportProgress?(progressReporter.totalProgress) + let imageSource = progressReporter.tasks[i].imageSource + let data = progressReporter.tasks[i].tempData let progress = progressReporter.tasks[i].progress - return progress.completedUnitCount == progress.totalUnitCount + let final = progress.completedUnitCount == progress.totalUnitCount + + CGImageSourceUpdateData(imageSource, data, final) + + if let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { + let image = UIImage(CGImage: cgImage) + if let imageTransform = progressReporter.tasks[i].imageTransform { + let tranformedImage = imageTransform(image) + if (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) > 0.5 { + print("\(tranformedImage)") + } + } + } + + return final } } } From e83220df125a7a7193d3088be2fb67c4f1ceb840 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 27 Jan 2016 10:32:51 +0800 Subject: [PATCH 4/8] progressive show downloading message image --- Yep/Caches/ImageCache.swift | 4 ++-- Yep/Services/YepDownloader.swift | 14 ++++++-------- .../Cells/ChatLeftAudio/ChatLeftAudioCell.swift | 2 +- .../Cells/ChatRightAudio/ChatRightAudioCell.swift | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Yep/Caches/ImageCache.swift b/Yep/Caches/ImageCache.swift index 2b639ce5..22033782 100644 --- a/Yep/Caches/ImageCache.swift +++ b/Yep/Caches/ImageCache.swift @@ -213,9 +213,9 @@ class ImageCache { let mediaType = message.mediaType - YepDownloader.downloadAttachmentsOfMessage(message, reportProgress: { progress in + YepDownloader.downloadAttachmentsOfMessage(message, reportProgress: { progress, image in dispatch_async(dispatch_get_main_queue()) { - completion(loadingProgress: progress, image: nil) + completion(loadingProgress: progress, image: image) } }, imageTransform: { image in diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index ed7f36b8..e8d7acc8 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -61,7 +61,7 @@ class YepDownloader: NSObject { let tasks: [Task] var finishedTasksCount = 0 - typealias ReportProgress = Double -> Void + typealias ReportProgress = (progress: Double, image: UIImage?) -> Void let reportProgress: ReportProgress? init(tasks: [Task], reportProgress: ReportProgress?) { @@ -248,7 +248,7 @@ extension YepDownloader: NSURLSessionDataDelegate { progressReporter.tasks[i].progress.totalUnitCount = totalBytes - progressReporter.reportProgress?(progressReporter.totalProgress) + progressReporter.reportProgress?(progress: progressReporter.totalProgress, image: nil) return } @@ -268,8 +268,6 @@ extension YepDownloader: NSURLSessionDataDelegate { progressReporter.tasks[i].progress.completedUnitCount += didReceiveDataBytes progressReporter.tasks[i].tempData.appendData(data) - progressReporter.reportProgress?(progressReporter.totalProgress) - let imageSource = progressReporter.tasks[i].imageSource let data = progressReporter.tasks[i].tempData let progress = progressReporter.tasks[i].progress @@ -277,16 +275,16 @@ extension YepDownloader: NSURLSessionDataDelegate { CGImageSourceUpdateData(imageSource, data, final) + var tranformedImage: UIImage? if let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { let image = UIImage(CGImage: cgImage) if let imageTransform = progressReporter.tasks[i].imageTransform { - let tranformedImage = imageTransform(image) - if (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) > 0.5 { - print("\(tranformedImage)") - } + tranformedImage = imageTransform(image) } } + progressReporter.reportProgress?(progress: progressReporter.totalProgress, image: tranformedImage) + return final } } diff --git a/Yep/Views/Cells/ChatLeftAudio/ChatLeftAudioCell.swift b/Yep/Views/Cells/ChatLeftAudio/ChatLeftAudioCell.swift index a48eef87..d99c252f 100644 --- a/Yep/Views/Cells/ChatLeftAudio/ChatLeftAudioCell.swift +++ b/Yep/Views/Cells/ChatLeftAudio/ChatLeftAudioCell.swift @@ -143,7 +143,7 @@ class ChatLeftAudioCell: ChatBaseCell { self.audioPlayedDuration = audioPlayedDuration - YepDownloader.downloadAttachmentsOfMessage(message, reportProgress: { [weak self] progress in + YepDownloader.downloadAttachmentsOfMessage(message, reportProgress: { [weak self] progress, _ in dispatch_async(dispatch_get_main_queue()) { self?.loadingWithProgress(progress) } diff --git a/Yep/Views/Cells/ChatRightAudio/ChatRightAudioCell.swift b/Yep/Views/Cells/ChatRightAudio/ChatRightAudioCell.swift index 12acd130..c8eb90a9 100644 --- a/Yep/Views/Cells/ChatRightAudio/ChatRightAudioCell.swift +++ b/Yep/Views/Cells/ChatRightAudio/ChatRightAudioCell.swift @@ -114,7 +114,7 @@ class ChatRightAudioCell: ChatRightBaseCell { self.audioPlayedDuration = audioPlayedDuration - YepDownloader.downloadAttachmentsOfMessage(message, reportProgress: { _ in }) + YepDownloader.downloadAttachmentsOfMessage(message, reportProgress: { _, _ in }) UIView.performWithoutAnimation { [weak self] in self?.makeUI() From 4c031988414843f9a6e4bf0d9a4821ed57f7314d Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 27 Jan 2016 13:39:01 +0800 Subject: [PATCH 5/8] CGImage.yep_extendedCanvasCGImage; blur progresive image --- Yep.xcodeproj/project.pbxproj | 4 +++ Yep/Extensions/CGImage+Yep.swift | 52 ++++++++++++++++++++++++++++++++ Yep/Services/YepDownloader.swift | 13 ++++++++ 3 files changed, 69 insertions(+) create mode 100644 Yep/Extensions/CGImage+Yep.swift diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 9969e86c..4bbb246c 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -246,6 +246,7 @@ 50AFBF4B1BB2A44C007D19DA /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */; }; 50AFBF4E1BB3A594007D19DA /* bub3.caf in Resources */ = {isa = PBXBuildFile; fileRef = 50AFBF4D1BB3A594007D19DA /* bub3.caf */; }; 50AFBF5F1BB4F332007D19DA /* FeedsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */; }; + 50B22E461C588B6200219625 /* CGImage+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B22E451C588B6200219625 /* CGImage+Yep.swift */; }; 50B2CA921BD0BF3800668AC6 /* FeedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B2CA911BD0BF3800668AC6 /* FeedTextView.swift */; }; 50B2CA941BD0EF7900668AC6 /* MoreMessageTypesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B2CA931BD0EF7900668AC6 /* MoreMessageTypesView.swift */; }; 50B38FB71B69CD960064C132 /* Array+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FB61B69CD960064C132 /* Array+Yep.swift */; }; @@ -619,6 +620,7 @@ 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InfoView.swift; path = Views/InfoView/InfoView.swift; sourceTree = ""; }; 50AFBF4D1BB3A594007D19DA /* bub3.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = bub3.caf; path = Sounds/bub3.caf; sourceTree = ""; }; 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedsViewController.swift; path = ViewControllers/Feeds/FeedsViewController.swift; sourceTree = ""; }; + 50B22E451C588B6200219625 /* CGImage+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CGImage+Yep.swift"; path = "Extensions/CGImage+Yep.swift"; sourceTree = ""; }; 50B2CA911BD0BF3800668AC6 /* FeedTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedTextView.swift; path = Views/TextViews/FeedTextView.swift; sourceTree = ""; }; 50B2CA931BD0EF7900668AC6 /* MoreMessageTypesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MoreMessageTypesView.swift; path = Views/MoreMessageTypes/MoreMessageTypesView.swift; sourceTree = ""; }; 50B38FB61B69CD960064C132 /* Array+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Yep.swift"; path = "Extensions/Array+Yep.swift"; sourceTree = ""; }; @@ -1137,6 +1139,7 @@ 50DBDF041C4DD9530044E21B /* CGSize+Yep.swift */, 5023DE511AB6C51300B3EE96 /* CGRect+Yep.swift */, 5023DE581AB6DBC100B3EE96 /* UIImage+Yep.swift */, + 50B22E451C588B6200219625 /* CGImage+Yep.swift */, 506EC2091AC95BFC00CE42B3 /* UIFont+Yep.swift */, 0A3E605F1ACCA9C0003DC853 /* String+Yep.swift */, 50A9D44A1ACD37A8000B2599 /* NSFileManager+Yep.swift */, @@ -2649,6 +2652,7 @@ 50CDBE421ACA9B4200459CE0 /* ChatRightImageCell.swift in Sources */, 5099B9C41AB9510D002F940B /* RankView.swift in Sources */, 502AE5311AB85067005BD199 /* RegisterPickMobileViewController.swift in Sources */, + 50B22E461C588B6200219625 /* CGImage+Yep.swift in Sources */, 50535D1A1BCD19AE002FE1A4 /* TouchClosuresView.swift in Sources */, 506E241E1AE6391A00A33C1A /* TouchZoomButton.swift in Sources */, 5020B8A51C059662006CE8EA /* VoiceRecordSampleView.swift in Sources */, diff --git a/Yep/Extensions/CGImage+Yep.swift b/Yep/Extensions/CGImage+Yep.swift new file mode 100644 index 00000000..97c7c1bc --- /dev/null +++ b/Yep/Extensions/CGImage+Yep.swift @@ -0,0 +1,52 @@ +// +// CGImage+Yep.swift +// Yep +// +// Created by nixzhu on 16/1/27. +// Copyright © 2016年 Catch Inc. All rights reserved. +// + +import Foundation + +extension CGImage { + + var yep_extendedCanvasCGImage: CGImage { + + let width = CGImageGetWidth(self) + let height = CGImageGetHeight(self) + + guard width > 0 && height > 0 else { + return self + } + + func hasAlpha() -> Bool { + let alpha = CGImageGetAlphaInfo(self) + switch alpha { + case .First, .Last, .PremultipliedFirst, .PremultipliedLast: + return true + default: + return false + } + } + + var bitmapInfo = CGBitmapInfo.ByteOrder32Little.rawValue + if hasAlpha() { + bitmapInfo |= CGImageAlphaInfo.PremultipliedFirst.rawValue + } else { + bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst.rawValue + } + + guard let context = CGBitmapContextCreate(nil, width, height, 8, 0, CGColorSpaceCreateDeviceRGB(), bitmapInfo) else { + return self + } + + CGContextDrawImage(context, CGRect(x: 0, y: 0, width: width, height: height), self) + + guard let newCGImage = CGBitmapContextCreateImage(context) else { + return self + } + + return newCGImage + } +} + diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index e8d7acc8..fb996361 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -277,10 +277,23 @@ extension YepDownloader: NSURLSessionDataDelegate { var tranformedImage: UIImage? if let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { + /* let image = UIImage(CGImage: cgImage) if let imageTransform = progressReporter.tasks[i].imageTransform { tranformedImage = imageTransform(image) } + */ + let image = UIImage(CGImage: cgImage.yep_extendedCanvasCGImage) + if let blurredImage = image.blurredImageWithRadius(5, iterations: 7, tintColor: UIColor.clearColor()) { + if let imageTransform = progressReporter.tasks[i].imageTransform { + tranformedImage = imageTransform(blurredImage) + /* + if progressReporter.totalProgress > 0.3 { + print("imageTransform") + } + */ + } + } } progressReporter.reportProgress?(progress: progressReporter.totalProgress, image: tranformedImage) From 50bd136b3324cc7fd20016e9e96445bcca26de6f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 27 Jan 2016 15:50:00 +0800 Subject: [PATCH 6/8] not working yep_progressiveImage --- Yep/Extensions/UIImage+Yep.swift | 48 +++++++++++++++++++ Yep/Services/YepDownloader.swift | 3 +- .../ConversationViewController.swift | 8 ++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Yep/Extensions/UIImage+Yep.swift b/Yep/Extensions/UIImage+Yep.swift index 88991e10..97ce17bd 100644 --- a/Yep/Extensions/UIImage+Yep.swift +++ b/Yep/Extensions/UIImage+Yep.swift @@ -8,6 +8,8 @@ import UIKit import Ruler +import ImageIO +import MobileCoreServices extension UIImage { @@ -572,3 +574,49 @@ extension UIImage { } } +// MARK: Progressive + +extension UIImage { + + var yep_progressiveImage: UIImage? { + + guard let cgImage = CGImage else { + return nil + } + + let data = NSMutableData() + + guard let distination = CGImageDestinationCreateWithData(data, kUTTypeJPEG, 1, nil) else { + return nil + } + + let jfifProperties = [ + kCGImagePropertyJFIFIsProgressive as String: kCFBooleanTrue as Bool, + kCGImagePropertyJFIFXDensity as String: 72, + kCGImagePropertyJFIFYDensity as String: 72, + kCGImagePropertyJFIFDensityUnit as String: 1, + ] + + let properties = [ + kCGImageDestinationLossyCompressionQuality as String: 0.9, + kCGImagePropertyJFIFDictionary as String: jfifProperties, + ] + + CGImageDestinationAddImage(distination, cgImage, properties) + + guard CGImageDestinationFinalize(distination) else { + return nil + } + + guard data.length > 0 else { + return nil + } + + guard let progressiveImage = UIImage(data: data) else { + return nil + } + + return progressiveImage + } +} + diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index fb996361..46c738e4 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -290,8 +290,7 @@ extension YepDownloader: NSURLSessionDataDelegate { /* if progressReporter.totalProgress > 0.3 { print("imageTransform") - } - */ + }*/ } } } diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 4fc2149b..32b1bf23 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -4633,6 +4633,14 @@ extension ConversationViewController: UIImagePickerControllerDelegate, UINavigat // Do send let imageData = UIImageJPEGRepresentation(image, YepConfig.messageImageCompressionQuality())! + /* + var imageData = UIImageJPEGRepresentation(image, YepConfig.messageImageCompressionQuality())! + + if let progressiveImage = UIImage(data: imageData)?.yep_progressiveImage { + + imageData = UIImageJPEGRepresentation(progressiveImage, YepConfig.messageImageCompressionQuality())! + } + */ let messageImageName = NSUUID().UUIDString From 9f0af24f1e5bcf26f4dacca24e87c1c4e1f11963 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 27 Jan 2016 16:37:38 +0800 Subject: [PATCH 7/8] blurPercent --- Yep/Services/YepDownloader.swift | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index 46c738e4..d5381ddd 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -284,13 +284,20 @@ extension YepDownloader: NSURLSessionDataDelegate { } */ let image = UIImage(CGImage: cgImage.yep_extendedCanvasCGImage) - if let blurredImage = image.blurredImageWithRadius(5, iterations: 7, tintColor: UIColor.clearColor()) { - if let imageTransform = progressReporter.tasks[i].imageTransform { - tranformedImage = imageTransform(blurredImage) - /* - if progressReporter.totalProgress > 0.3 { - print("imageTransform") - }*/ + + if progressReporter.totalProgress < 1 { + let blurPercent = CGFloat(1 - progressReporter.totalProgress) + let radius = 5 * blurPercent + let iterations = UInt(10 * blurPercent) + println("radius: \(radius), iterations: \(iterations)") + if let blurredImage = image.blurredImageWithRadius(radius, iterations: iterations, tintColor: UIColor.clearColor()) { + if let imageTransform = progressReporter.tasks[i].imageTransform { + tranformedImage = imageTransform(blurredImage) + /* + if progressReporter.totalProgress > 0.3 { + print("imageTransform") + }*/ + } } } } @@ -331,18 +338,18 @@ extension YepDownloader: NSURLSessionDataDelegate { } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) { - print("YepDownloader begin, expectedContentLength:\(response.expectedContentLength)") + println("YepDownloader begin, expectedContentLength:\(response.expectedContentLength)") reportProgressAssociatedWithDownloadTask(dataTask, totalBytes: response.expectedContentLength) completionHandler(.Allow) } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { - print("YepDownloader data.length: \(data.length)") + println("YepDownloader data.length: \(data.length)") let finish = reportProgressAssociatedWithDownloadTask(dataTask, didReceiveData: data) if finish { - print("finish") + println("YepDownloader finish") finishDownloadTask(dataTask) } From 35c13e1ab5d0d9e9d9660720542e49a671b1e116 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Sat, 30 Jan 2016 10:00:33 +0800 Subject: [PATCH 8/8] do not pass tranformedImage with progressReporter.reportProgress for now --- Yep/Services/YepDownloader.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Yep/Services/YepDownloader.swift b/Yep/Services/YepDownloader.swift index d5381ddd..5a2e5f31 100644 --- a/Yep/Services/YepDownloader.swift +++ b/Yep/Services/YepDownloader.swift @@ -268,21 +268,22 @@ extension YepDownloader: NSURLSessionDataDelegate { progressReporter.tasks[i].progress.completedUnitCount += didReceiveDataBytes progressReporter.tasks[i].tempData.appendData(data) - let imageSource = progressReporter.tasks[i].imageSource - let data = progressReporter.tasks[i].tempData let progress = progressReporter.tasks[i].progress let final = progress.completedUnitCount == progress.totalUnitCount + progressReporter.reportProgress?(progress: progressReporter.totalProgress, image: nil) + /* + let imageSource = progressReporter.tasks[i].imageSource + let data = progressReporter.tasks[i].tempData CGImageSourceUpdateData(imageSource, data, final) var tranformedImage: UIImage? if let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { - /* let image = UIImage(CGImage: cgImage) if let imageTransform = progressReporter.tasks[i].imageTransform { tranformedImage = imageTransform(image) } - */ + /* let image = UIImage(CGImage: cgImage.yep_extendedCanvasCGImage) if progressReporter.totalProgress < 1 { @@ -300,9 +301,11 @@ extension YepDownloader: NSURLSessionDataDelegate { } } } + */ } progressReporter.reportProgress?(progress: progressReporter.totalProgress, image: tranformedImage) + */ return final }