84 lines
3.3 KiB
Dart
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
|