mirror of
https://github.com/OpenFlutter/fluwx.git
synced 2025-08-23 22:46:21 +08:00
135 lines
4.5 KiB
Objective-C
135 lines
4.5 KiB
Objective-C
//
|
|
// Created by mo on 2020/3/7.
|
|
//
|
|
|
|
#import "ThumbnailHelper.h"
|
|
|
|
|
|
@implementation ThumbnailHelper
|
|
|
|
+ (NSData *)compressImageData:(NSData *)imageData toByte:(NSUInteger)maxLength {
|
|
// Compress by quality
|
|
CGFloat compression = 1;
|
|
NSData *data = imageData;
|
|
NSLog(@"压缩前 %lu %lu", (unsigned long)data.length,maxLength);
|
|
if (data.length < maxLength) return data;
|
|
|
|
UIImage *image = [UIImage imageWithData:imageData];
|
|
CGFloat max = 1;
|
|
CGFloat min = 0;
|
|
for (int i = 0; i < 6; ++i) {
|
|
compression = (max + min) / 2;
|
|
data = UIImageJPEGRepresentation(image, compression);
|
|
if (data.length < maxLength * 0.9) {
|
|
min = compression;
|
|
} else if (data.length > maxLength) {
|
|
max = compression;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
NSLog(@"压缩第一次 %lu %lu", (unsigned long)data.length,maxLength);
|
|
if (data.length < maxLength) return data;
|
|
|
|
UIImage *resultImage;
|
|
|
|
resultImage = [UIImage imageWithData:data];
|
|
|
|
// Compress by size
|
|
NSUInteger lastDataLength = 0;
|
|
while (data.length > maxLength && data.length != lastDataLength) {
|
|
lastDataLength = data.length;
|
|
CGFloat ratio = (CGFloat) maxLength / data.length;
|
|
CGSize size = CGSizeMake((NSUInteger) (resultImage.size.width * sqrtf(ratio)),
|
|
(NSUInteger) (resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank
|
|
UIGraphicsBeginImageContext(size);
|
|
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
|
|
resultImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
data = UIImageJPEGRepresentation(resultImage, compression);
|
|
}
|
|
|
|
NSLog(@"压缩第二次 %lu %lu", (unsigned long)data.length,maxLength);
|
|
return data;
|
|
}
|
|
|
|
+ (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength isPNG:(BOOL)isPNG {
|
|
// Compress by quality
|
|
CGFloat compression = 1;
|
|
NSData *data = UIImageJPEGRepresentation(image, compression);
|
|
if (data.length < maxLength) return image;
|
|
|
|
CGFloat max = 1;
|
|
CGFloat min = 0;
|
|
for (int i = 0; i < 6; ++i) {
|
|
compression = (max + min) / 2;
|
|
data = UIImageJPEGRepresentation(image, compression);
|
|
if (data.length < maxLength * 0.9) {
|
|
min = compression;
|
|
} else if (data.length > maxLength) {
|
|
max = compression;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
UIImage *resultImage;
|
|
if (isPNG) {
|
|
NSData *tmp = UIImagePNGRepresentation([UIImage imageWithData:data]);
|
|
resultImage = [UIImage imageWithData:tmp];
|
|
} else {
|
|
resultImage = [UIImage imageWithData:data];
|
|
}
|
|
|
|
|
|
if (data.length < maxLength) return resultImage;
|
|
|
|
// Compress by size
|
|
NSUInteger lastDataLength = 0;
|
|
while (data.length > maxLength && data.length != lastDataLength) {
|
|
lastDataLength = data.length;
|
|
CGFloat ratio = (CGFloat) maxLength / data.length;
|
|
CGSize size = CGSizeMake((NSUInteger) (resultImage.size.width * sqrtf(ratio)),
|
|
(NSUInteger) (resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank
|
|
UIGraphicsBeginImageContext(size);
|
|
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
|
|
resultImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
data = UIImageJPEGRepresentation(resultImage, compression);
|
|
}
|
|
|
|
return resultImage;
|
|
}
|
|
|
|
|
|
- (UIImage *)scaleFromImage:(UIImage *)image width:(CGSize)newSize {
|
|
CGSize imageSize = image.size;
|
|
CGFloat width = imageSize.width;
|
|
CGFloat height = imageSize.height;
|
|
|
|
if (width <= newSize.width && height <= newSize.height) {
|
|
return image;
|
|
}
|
|
|
|
if (width == 0 || height == 0) {
|
|
return image;
|
|
}
|
|
|
|
CGFloat widthFactor = newSize.width / width;
|
|
CGFloat heightFactor = newSize.height / height;
|
|
CGFloat scaleFactor = (widthFactor < heightFactor ? widthFactor : heightFactor);
|
|
|
|
CGFloat scaledWidth = width * scaleFactor;
|
|
CGFloat scaledHeight = height * scaleFactor;
|
|
CGSize targetSize = CGSizeMake(scaledWidth, scaledHeight);
|
|
|
|
UIGraphicsBeginImageContext(targetSize);
|
|
[image drawInRect:CGRectMake(0, 0, scaledWidth, scaledHeight)];
|
|
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
return newImage;
|
|
}
|
|
|
|
@end
|