diff --git a/SDWebImage/Core/SDImageIOAnimatedCoder.m b/SDWebImage/Core/SDImageIOAnimatedCoder.m index b1bd1b24..e5247cb1 100644 --- a/SDWebImage/Core/SDImageIOAnimatedCoder.m +++ b/SDWebImage/Core/SDImageIOAnimatedCoder.m @@ -499,7 +499,9 @@ static NSString * kSDCGImageDestinationRequestedFileSize = @"kCGImageDestination CGFloat pixelWidth = (CGFloat)CGImageGetWidth(imageRef); CGFloat pixelHeight = (CGFloat)CGImageGetHeight(imageRef); CGFloat finalPixelSize = 0; - if (maxPixelSize.width > 0 && maxPixelSize.height > 0 && pixelWidth > maxPixelSize.width && pixelHeight > maxPixelSize.height) { + BOOL encodeFullImage = maxPixelSize.width == 0 || maxPixelSize.height == 0 || pixelWidth == 0 || pixelHeight == 0 || (pixelWidth <= maxPixelSize.width && pixelHeight <= maxPixelSize.height); + if (!encodeFullImage) { + // Thumbnail Encoding CGFloat pixelRatio = pixelWidth / pixelHeight; CGFloat maxPixelSizeRatio = maxPixelSize.width / maxPixelSize.height; if (pixelRatio > maxPixelSizeRatio) { diff --git a/SDWebImage/Core/SDImageIOCoder.m b/SDWebImage/Core/SDImageIOCoder.m index 7149b444..7b5b4a8a 100644 --- a/SDWebImage/Core/SDImageIOCoder.m +++ b/SDWebImage/Core/SDImageIOCoder.m @@ -252,10 +252,12 @@ static NSString * kSDCGImageDestinationRequestedFileSize = @"kCGImageDestination } CGFloat pixelWidth = (CGFloat)CGImageGetWidth(imageRef); CGFloat pixelHeight = (CGFloat)CGImageGetHeight(imageRef); - if (maxPixelSize.width > 0 && maxPixelSize.height > 0 && pixelWidth > maxPixelSize.width && pixelHeight > maxPixelSize.height) { + CGFloat finalPixelSize = 0; + BOOL encodeFullImage = maxPixelSize.width == 0 || maxPixelSize.height == 0 || pixelWidth == 0 || pixelHeight == 0 || (pixelWidth <= maxPixelSize.width && pixelHeight <= maxPixelSize.height); + if (!encodeFullImage) { + // Thumbnail Encoding CGFloat pixelRatio = pixelWidth / pixelHeight; CGFloat maxPixelSizeRatio = maxPixelSize.width / maxPixelSize.height; - CGFloat finalPixelSize; if (pixelRatio > maxPixelSizeRatio) { finalPixelSize = MAX(maxPixelSize.width, maxPixelSize.width / pixelRatio); } else { diff --git a/Tests/Tests/SDImageCoderTests.m b/Tests/Tests/SDImageCoderTests.m index ba927abc..b8e09da7 100644 --- a/Tests/Tests/SDImageCoderTests.m +++ b/Tests/Tests/SDImageCoderTests.m @@ -341,7 +341,7 @@ } } -- (void)test22ThatThumbnailPreserveAspectRatio { +- (void)test22ThatThumbnailDecodeCalculation { NSString *testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImageLarge" ofType:@"jpg"]; NSData *testImageData = [NSData dataWithContentsOfFile:testImagePath]; CGSize thumbnailSize = CGSizeMake(400, 300); @@ -353,6 +353,19 @@ expect(imageSize.height).equal(263); } +- (void)test23ThatThumbnailEncodeCalculation { + NSString *testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImageLarge" ofType:@"jpg"]; + NSData *testImageData = [NSData dataWithContentsOfFile:testImagePath]; + UIImage *image = [SDImageIOCoder.sharedCoder decodedImageWithData:testImageData options:nil]; + expect(image.size).equal(CGSizeMake(5250, 3450)); + CGSize thumbnailSize = CGSizeMake(4000, 4000); // 3450 < 4000 < 5250 + NSData *encodedData = [SDImageIOCoder.sharedCoder encodedDataWithImage:image format:SDImageFormatJPEG options:@{ + SDImageCoderEncodeMaxPixelSize: @(thumbnailSize) + }]; + UIImage *encodedImage = [UIImage sd_imageWithData:encodedData]; + expect(encodedImage.size).equal(CGSizeMake(4000, 2629)); +} + #pragma mark - Utils - (void)verifyCoder:(id)coder