From 7e50d78c8094ef5d319e5c17a88d765fb36b32d1 Mon Sep 17 00:00:00 2001 From: Pete Callaway Date: Thu, 14 Aug 2014 11:48:38 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Don=E2=80=99t=20pass=20the=20original=20ima?= =?UTF-8?q?ge=20data=20to=20be=20cached=20if=20the=20image=20has=20been=20?= =?UTF-8?q?transformed=20as=20transparency=20may=20have=20been=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SDWebImage/SDWebImageManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 4a94a79..e8b1f67 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -210,7 +210,7 @@ if (transformedImage && finished) { BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:data forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:imageWasTransformed ? nil : data forKey:key toDisk:cacheOnDisk]; } dispatch_main_sync_safe(^{ From 38a6edb02a3a836db71af96a9ae80f5a5b1f3591 Mon Sep 17 00:00:00 2001 From: Dan Dofter Date: Thu, 2 Apr 2015 17:50:20 -0700 Subject: [PATCH 2/2] Only store an image with unknown format as PNG if it has an alpha channel. --- SDWebImage/SDImageCache.m | 10 +++++++--- SDWebImage/SDWebImageManager.m | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index c648c63..e348c7d 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -175,9 +175,13 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // The first eight bytes of a PNG file always contain the following (decimal) values: // 137 80 78 71 13 10 26 10 - // We assume the image is PNG, in case the imageData is nil (i.e. if trying to save a UIImage directly), - // we will consider it PNG to avoid loosing the transparency - BOOL imageIsPng = YES; + // If the imageData is nil (i.e. if trying to save a UIImage directly or the image was transformed on download) + // and the image has an alpha channel, we will consider it PNG to avoid losing the transparency + int alphaInfo = CGImageGetAlphaInfo(image.CGImage); + BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || + alphaInfo == kCGImageAlphaNoneSkipFirst || + alphaInfo == kCGImageAlphaNoneSkipLast); + BOOL imageIsPng = hasAlpha; // But if we have an image data, we will look at the preffix if ([imageData length] >= [kPNGSignatureData length]) { diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index e8b1f67..823c5b0 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -210,7 +210,7 @@ if (transformedImage && finished) { BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:imageWasTransformed ? nil : data forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:(imageWasTransformed ? nil : data) forKey:key toDisk:cacheOnDisk]; } dispatch_main_sync_safe(^{