Unverified 提交 518f31b7 authored 作者: JarvanMo's avatar JarvanMo 提交者: GitHub

Merge pull request #475 from 9527001/feat-compress_ios

分享小程序,data数据压缩成功,但是image转data 导致图片大小变大
...@@ -235,16 +235,15 @@ NSObject <FlutterPluginRegistrar> *_fluwxRegistrar; ...@@ -235,16 +235,15 @@ NSObject <FlutterPluginRegistrar> *_fluwxRegistrar;
NSDictionary *hdImagePath = call.arguments[@"hdImagePath"]; NSDictionary *hdImagePath = call.arguments[@"hdImagePath"];
if (hdImagePath != (id) [NSNull null]) { if (hdImagePath != (id) [NSNull null]) {
NSData *imageData = [self getNsDataFromWeChatFile:hdImagePath]; NSData *imageData = [self getNsDataFromWeChatFile:hdImagePath];
NSString *suffix = hdImagePath[@"suffix"];
BOOL isPNG = [self isPNG:suffix];
BOOL compress = call.arguments[fluwxKeyCompressThumbnail]; BOOL compress = call.arguments[fluwxKeyCompressThumbnail];
UIImage *uiImage = [self getThumbnailFromNSData:imageData size:120 * 1024 isPNG:isPNG compress:compress]; hdImageData = [self getThumbnailDataFromNSData:imageData size:120 * 1024 compress:compress];
if (isPNG) { // UIImage *uiImage = [self getThumbnailFromNSData:imageData size:120 * 1024 isPNG:isPNG compress:compress];
hdImageData = UIImagePNGRepresentation(uiImage); // if (isPNG) {
} else { // hdImageData = UIImagePNGRepresentation(uiImage);
hdImageData = UIImageJPEGRepresentation(uiImage, 1); // } else {
} // hdImageData = UIImageJPEGRepresentation(uiImage, 1);
// }
} }
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
...@@ -332,6 +331,14 @@ NSObject <FlutterPluginRegistrar> *_fluwxRegistrar; ...@@ -332,6 +331,14 @@ NSObject <FlutterPluginRegistrar> *_fluwxRegistrar;
return uiImage; return uiImage;
} }
- (NSData *)getThumbnailDataFromNSData:(NSData *)data size:(NSUInteger)size compress:(BOOL)compress {
if(compress) {
return [ThumbnailHelper compressImageData:data toByte:size];
} else{
return data;
}
}
- (NSString *)readFileFromAssets:(NSString *)imagePath { - (NSString *)readFileFromAssets:(NSString *)imagePath {
NSArray *array = [self formatAssets:imagePath]; NSArray *array = [self formatAssets:imagePath];
NSString *key; NSString *key;
......
...@@ -7,4 +7,10 @@ ...@@ -7,4 +7,10 @@
@interface ThumbnailHelper : NSObject @interface ThumbnailHelper : NSObject
+ (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength isPNG:(BOOL)isPNG; + (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength isPNG:(BOOL)isPNG;
/// NSData 压缩后转NSData
/// @param imageData 来源data
/// @param maxLength 压缩目标值,压缩结果在maxLength的0.9~1之间
+ (NSData *)compressImageData:(NSData *)imageData toByte:(NSUInteger)maxLength;
@end @end
...@@ -7,6 +7,53 @@ ...@@ -7,6 +7,53 @@
@implementation ThumbnailHelper @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 { + (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength isPNG:(BOOL)isPNG {
// Compress by quality // Compress by quality
CGFloat compression = 1; CGFloat compression = 1;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论