ente/thirdparty/flutter_image_compress/ios/Classes/CompressHandler.m
2021-01-21 16:19:12 +05:30

84 lines
3.3 KiB
Dart

//
// Created by cjl on 2018/9/8.
//
#import "CompressHandler.h"
#import "UIImage+scale.h"
#import "FlutterImageCompressPlugin.h"
#import "SDImageWebPCoder.h"
@implementation CompressHandler {
}
+ (NSData *)compressWithData:(NSData *)data minWidth:(int)minWidth minHeight:(int)minHeight quality:(int)quality
rotate:(int)rotate format:(int)format {
UIImage *img = [[UIImage alloc] initWithData:data];
return [CompressHandler compressWithUIImage:img minWidth:minWidth minHeight:minHeight quality:quality rotate:rotate format:format];
}
+ (NSData *)compressWithUIImage:(UIImage *)image minWidth:(int)minWidth minHeight:(int)minHeight quality:(int)quality
rotate:(int)rotate format:(int)format {
if([FlutterImageCompressPlugin showLog]){
NSLog(@"width = %.0f",[image size].width);
NSLog(@"height = %.0f",[image size].height);
NSLog(@"minWidth = %d",minWidth);
NSLog(@"minHeight = %d",minHeight);
NSLog(@"format = %d", format);
}
image = [image scaleWithMinWidth:minWidth minHeight:minHeight];
if(rotate % 360 != 0){
image = [image rotate: rotate];
}
NSData *resultData = [self compressDataWithImage:image quality:quality format:format];
return resultData;
}
+ (NSData *)compressDataWithUIImage:(UIImage *)image minWidth:(int)minWidth minHeight:(int)minHeight
quality:(int)quality rotate:(int)rotate format:(int)format {
image = [image scaleWithMinWidth:minWidth minHeight:minHeight];
if(rotate % 360 != 0){
image = [image rotate: rotate];
}
return [self compressDataWithImage:image quality:quality format:format];
}
+ (NSData *)compressDataWithImage:(UIImage *)image quality:(float)quality format:(int)format {
NSData *data;
if (format == 2) { // heic
CIImage *ciImage = [CIImage imageWithCGImage:image.CGImage];
CIContext *ciContext = [[CIContext alloc]initWithOptions:nil];
NSString *tmpDir = NSTemporaryDirectory();
double time = [[NSDate alloc]init].timeIntervalSince1970;
NSString *target = [NSString stringWithFormat:@"%@%.0f.heic",tmpDir, time * 1000];
NSURL *url = [NSURL fileURLWithPath:target];
NSMutableDictionary *options = [NSMutableDictionary new];
NSString *qualityKey = (__bridge NSString *)kCGImageDestinationLossyCompressionQuality;
// CIImageRepresentationOption
[options setObject:@(quality / 100) forKey: qualityKey];
if (@available(iOS 11.0, *)) {
[ciContext writeHEIFRepresentationOfImage:ciImage toURL:url format: kCIFormatARGB8 colorSpace: ciImage.colorSpace options:options error:nil];
data = [NSData dataWithContentsOfURL:url];
} else {
// Fallback on earlier versions
data = nil;
}
} else if(format == 3){ // webp
/* SDImageCoderOptions *option = @{SDImageCoderEncodeCompressionQuality: @(quality / 100)};
data = [[SDImageWebPCoder sharedCoder]encodedDataWithImage:image format:SDImageFormatWebP options:option]; */
} else if(format == 1){ // png
data = UIImagePNGRepresentation(image);
}else { // 0 or other is jpeg
data = UIImageJPEGRepresentation(image, (CGFloat) quality / 100);
}
return data;
}
@end