提交 628ec4a2 authored 作者: JarvanMo's avatar JarvanMo

ios 图片处理

上级 b1ea9551
......@@ -42,6 +42,10 @@ object FluwxShareHandler {
fun registerApp(call: MethodCall, result: MethodChannel.Result) {
if(!call.argument<Boolean>(WechatPluginKeys.ANDROID)){
result.success(mapOf(
WechatPluginKeys.PLATFORM to WechatPluginKeys.ANDROID,
WechatPluginKeys.RESULT to false
))
return
}
......
#import <Flutter/Flutter.h>
#import "FluwxMethods.h"
#import "FluwxKeys.h"
@class FluwxShareHandler;
......
......@@ -3,7 +3,7 @@
#import "WXApi.h"
#import "StringUtil.h"
#import "../../../../../../ios/Classes/handler/FluwxShareHandler.h"
#import "ImageSchema.h"
@implementation FluwxPlugin
......@@ -31,6 +31,8 @@ BOOL isWeChatRegistered = NO;
}
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
if ([registerApp isEqualToString:call.method]) {
[self initWeChatIfNeeded:call result:result];
return;
......@@ -56,12 +58,18 @@ BOOL isWeChatRegistered = NO;
- (void)initWeChatIfNeeded:(FlutterMethodCall *)call result:(FlutterResult)result {
if(!call.arguments[fluwxKeyIOS]){
result(@{fluwxKeyPlatform:fluwxKeyIOS,fluwxKeyResult:@NO});
return;
}
if (isWeChatRegistered) {
result(@YES);
result(@{fluwxKeyPlatform:fluwxKeyIOS,fluwxKeyResult:@YES});
return;
}
NSString *appId = call.arguments;
NSString *appId = call.arguments[appId];
if ([StringUtil isBlank:appId]) {
result([FlutterError errorWithCode:@"invalid app id" message:@"are you sure your app id is correct ? " details:appId]);
return;
......@@ -69,13 +77,15 @@ BOOL isWeChatRegistered = NO;
isWeChatRegistered = [WXApi registerApp:appId];
result(@YES);
result(@{fluwxKeyPlatform:fluwxKeyIOS,fluwxKeyResult: @(isWeChatRegistered)});
}
- (void)unregisterApp:(FlutterMethodCall *)call result:(FlutterResult)result {
[WXApi ];
isWeChatRegistered = false;
result(@YES);
}
@end
......@@ -5,8 +5,8 @@
#import "CallResults.h"
NSString *const resultDone = @"done";
NSString *const resultErrorNeedWeChat = @"init wechat sdk please";
NSString *const resultMessageNeedWeChat = @"init wechat sdk please";
NSString *const resultErrorNeedWeChat = @"wxapi not configured";
NSString *const resultMessageNeedWeChat = @"please config wxapi first";
@implementation CallResults {
}
......
......@@ -23,5 +23,10 @@ extern NSString *const fluwxKeyMediaTagName;
extern NSString *const fluwxKeyMessageAction;
extern NSString *const fluwxKeyPlatform;
extern NSString *const fluwxKeyIOS;
extern NSString *const fluwxKeyResult;
@interface FluwxKeys : NSObject
@end
\ No newline at end of file
......@@ -22,6 +22,11 @@ NSString *const fluwxKeyMessageExt =@"messageExt";
NSString *const fluwxKeyMediaTagName = @"mediaTagName ";
NSString *const fluwxKeyMessageAction = @"messageAction";
NSString *const fluwxKeyPlatform = @"platform";
NSString *const fluwxKeyIOS=@"iOS";
NSString *const fluwxKeyResult=@"result";
@implementation FluwxKeys {
}
......
......@@ -11,6 +11,8 @@
#import "FluwxMethods.h"
#import <Flutter/Flutter.h>
#import "FluwxPlugin.h"
#import "ThumbnailHelper.h"
#import "NSStringWrapper.h"
@class StringUtil;
@interface FluwxShareHandler : NSObject
......
......@@ -9,6 +9,9 @@
@implementation FluwxShareHandler
CGFloat thumbnailWidth;
NSObject <FlutterPluginRegistrar> *_registrar;
......@@ -16,6 +19,7 @@ NSObject <FlutterPluginRegistrar> *_registrar;
self = [super init];
if (self) {
_registrar = registrar;
thumbnailWidth = 150;
}
return self;
......@@ -55,17 +59,14 @@ NSObject <FlutterPluginRegistrar> *_registrar;
- (void)shareImage:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *imagePath = call.arguments[fluwxKeyImage];
if ([imagePath hasPrefix:SCHEMA_ASSETS]) {
[self shareAssetImage:call result:result imagePath:imagePath];
} else if ([imagePath hasPrefix:SCHEMA_FILE]) {
} else {
[self shareNetworkImage:call result:result imagePath:imagePath];
}
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendText:text InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
}
......@@ -87,24 +88,46 @@ NSObject <FlutterPluginRegistrar> *_registrar;
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
NSData *thumbnailData;
UIImage *thumbnailImage;
UIImage *thumbnailImage = [self getThumbnail:thumbnail size:32 * 1024];
if ([thumbnail hasPrefix:SCHEMA_ASSETS]) {
} else if ([thumbnail hasPrefix:SCHEMA_FILE]) {
} else {
NSURL *thumbnailURL = [NSURL URLWithString:thumbnail];
thumbnailData = [NSData dataWithContentsOfURL:thumbnailURL];
if ([thumbnailData length] > (32 * 1024)) {
dispatch_async(dispatch_get_main_queue(), ^{
} else {
thumbnailImage = [UIImage imageWithData:thumbnailData];
}
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendImageData:imageData
TagName:call.arguments[fluwxKeyMediaTagName]
MessageExt:fluwxKeyMessageExt
Action:fluwxKeyMessageAction
ThumbImage:thumbnailImage
InScene:[StringToWeChatScene toScene:scene]];
result(@{fluwxKeyPlatform:fluwxKeyIOS,fluwxKeyResult:@(done)});
});
});
}
- (void)shareAssetImage:(FlutterMethodCall *)call result:(FlutterResult)result imagePath:(NSString *)imagePath {
NSString *thumbnail = call.arguments[fluwxKeyThumbnail];
if ([StringUtil isBlank:thumbnail]) {
thumbnail = imagePath;
}
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
NSData *imageData = [NSData dataWithContentsOfFile:[self readImageFromAssets:imagePath]];
UIImage *thumbnailImage = [self getThumbnail:thumbnail size:32 * 1024];
dispatch_async(dispatch_get_main_queue(), ^{
NSString *scene = call.arguments[fluwxKeyScene];
......@@ -114,28 +137,50 @@ NSObject <FlutterPluginRegistrar> *_registrar;
Action:fluwxKeyMessageAction
ThumbImage:thumbnailImage
InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
result(@{fluwxKeyPlatform:fluwxKeyIOS,fluwxKeyResult:@(done)});
});
});
}
- (void)shareWebPage:(FlutterMethodCall *)call result:(FlutterResult)result {
dispatch_queue_t globalQueue = dispatch_get_global_queue(1, 1);
dispatch_async(globalQueue, ^{
NSString *thumbnail = call.arguments[fluwxKeyThumbnail];
UIImage *thumbnailImage =[self getThumbnail:thumbnail size:32 * 1024];
NSData *imageData = [NSData dataWithContentsOfFile:[self readImageFromAssets:@""]];
dispatch_async(dispatch_get_main_queue(), ^{
NSString *webPageUrl = call.arguments[@"webPage"];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendImageData:imageData
TagName:call.arguments[fluwxKeyMediaTagName]
MessageExt:fluwxKeyMessageExt
Action:fluwxKeyMessageAction
ThumbImage:thumbnailImage
InScene:[StringToWeChatScene toScene:scene]];
result(@{fluwxKeyPlatform:fluwxKeyIOS,fluwxKeyResult:@(done)});
});
});
NSString *imagePath = call.arguments[fluwxKeyImage];
if ([imagePath hasPrefix:SCHEMA_ASSETS]) {
} else if ([imagePath hasPrefix:SCHEMA_FILE]) {
} else {
[self shareNetworkImage:call result:result imagePath:imagePath];
}
NSString *imagePath = call.arguments[fluwxKeyImage];
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
......@@ -144,43 +189,72 @@ NSObject <FlutterPluginRegistrar> *_registrar;
}
+ (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength {
// 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;
- (UIImage *) getThumbnail:(NSString *) thumbnail size:(NSUInteger) size{
UIImage *thumbnailImage = nil;
if ([StringUtil isBlank:thumbnail]) {
return nil;
}
if ([thumbnail hasPrefix:SCHEMA_ASSETS]) {
NSData *imageData2 = [NSData dataWithContentsOfFile:[self readImageFromAssets:thumbnail]];
UIImage *tmp = [UIImage imageWithData:imageData2];
thumbnailImage = [ThumbnailHelper compressImage:tmp toByte:size isPNG:FALSE];
} else if ([thumbnail hasPrefix:SCHEMA_FILE]) {
} else {
break;
NSURL *thumbnailURL = [NSURL URLWithString:thumbnail];
NSData *thumbnailData = [NSData dataWithContentsOfURL:thumbnailURL];
UIImage *tmp = [UIImage imageWithData:thumbnailData];
thumbnailImage = [ThumbnailHelper compressImage:tmp toByte:size isPNG:FALSE];
}
return thumbnailImage;
}
- (NSString *) readImageFromAssets:(NSString *) imagePath{
NSArray *array = [self formatAssets:imagePath];
NSString* key ;
if(array[1] == nil){
key = [_registrar lookupKeyForAsset:array[0]];
} else{
key = [_registrar lookupKeyForAsset:array[0] fromPackage:array[1]];
}
UIImage *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 [[NSBundle mainBundle] pathForResource:key ofType:nil];
}
-(NSArray *) formatAssets:(NSString *) originPath{
NSString *path = nil;
NSString *packageName = nil;
int from = [SCHEMA_ASSETS length];
int to = [originPath length];
NSString *pathWithoutSchema = [originPath substringFromIndex:from toIndex:to];
int indexOfPackage = [pathWithoutSchema lastIndexOfString:fluwxKeyPackage];
if( indexOfPackage != JavaNotFound){
path = [pathWithoutSchema substringFromIndex:0 toIndex:indexOfPackage];
int begin = indexOfPackage + [fluwxKeyPackage length];
packageName = [pathWithoutSchema substringFromIndex:begin toIndex:[pathWithoutSchema length]];
} else{
path = pathWithoutSchema;
}
return resultImage;
return @[path, packageName];
}
......
//
// NSStringWrapper.h
// NSStringWrapper
//
// Created by Tang Qiao on 12-2-4.
// Copyright (c) 2012年 blog.devtang.com. All rights reserved.
//
#import <Foundation/Foundation.h>
#define JavaNotFound -1
@interface NSString(Wrapper)
/** Return the char value at the specified index. */
- (unichar) charAt:(int)index;
/**
* Compares two strings lexicographically.
* the value 0 if the argument string is equal to this string;
* a value less than 0 if this string is lexicographically less than the string argument;
* and a value greater than 0 if this string is lexicographically greater than the string argument.
*/
- (int) compareTo:(NSString*) anotherString;
- (int) compareToIgnoreCase:(NSString*) str;
- (BOOL) contains:(NSString*) str;
- (BOOL) startsWith:(NSString*)prefix;
- (BOOL) endsWith:(NSString*)suffix;
- (BOOL) equals:(NSString*) anotherString;
- (BOOL) equalsIgnoreCase:(NSString*) anotherString;
- (int) indexOfChar:(unichar)ch;
- (int) indexOfChar:(unichar)ch fromIndex:(int)index;
- (int) indexOfString:(NSString*)str;
- (int) indexOfString:(NSString*)str fromIndex:(int)index;
- (int) lastIndexOfChar:(unichar)ch;
- (int) lastIndexOfChar:(unichar)ch fromIndex:(int)index;
- (int) lastIndexOfString:(NSString*)str;
- (int) lastIndexOfString:(NSString*)str fromIndex:(int)index;
- (NSString *) substringFromIndex:(int)beginIndex toIndex:(int)endIndex;
- (NSString *) toLowerCase;
- (NSString *) toUpperCase;
- (NSString *) trim;
- (NSString *) replaceAll:(NSString*)origin with:(NSString*)replacement;
- (NSArray *) split:(NSString*) separator;
@end
//
// NSStringWrapper.m
// NSStringWrapper
//
// Created by Tang Qiao on 12-2-4.
// Copyright (c) 2012年 blog.devtang.com. All rights reserved.
//
#import "NSStringWrapper.h"
@implementation NSString(Wrapper)
/** Java-like method. Returns the char value at the specified index. */
- (unichar) charAt:(int)index {
return [self characterAtIndex:index];
}
/**
* Java-like method. Compares two strings lexicographically.
* the value 0 if the argument string is equal to this string;
* a value less than 0 if this string is lexicographically less than the string argument;
* and a value greater than 0 if this string is lexicographically greater than the string argument.
*/
- (int) compareTo:(NSString*) anotherString {
return [self compare:anotherString];
}
/** Java-like method. Compares two strings lexicographically, ignoring case differences. */
- (int) compareToIgnoreCase:(NSString*) str {
return [self compare:str options:NSCaseInsensitiveSearch];
}
/** Java-like method. Returns true if and only if this string contains the specified sequence of char values. */
- (BOOL) contains:(NSString*) str {
NSRange range = [self rangeOfString:str];
return (range.location != NSNotFound);
}
- (BOOL) startsWith:(NSString*)prefix {
return [self hasPrefix:prefix];
}
- (BOOL) endsWith:(NSString*)suffix {
return [self hasSuffix:suffix];
}
- (BOOL) equals:(NSString*) anotherString {
return [self isEqualToString:anotherString];
}
- (BOOL) equalsIgnoreCase:(NSString*) anotherString {
return [[self toLowerCase] equals:[anotherString toLowerCase]];
}
- (int) indexOfChar:(unichar)ch{
return [self indexOfChar:ch fromIndex:0];
}
- (int) indexOfChar:(unichar)ch fromIndex:(int)index{
int len = self.length;
for (int i = index; i < len; ++i) {
if (ch == [self charAt:i]) {
return i;
}
}
return JavaNotFound;
}
- (int) indexOfString:(NSString*)str {
NSRange range = [self rangeOfString:str];
if (range.location == NSNotFound) {
return JavaNotFound;
}
return range.location;
}
- (int) indexOfString:(NSString*)str fromIndex:(int)index {
NSRange fromRange = NSMakeRange(index, self.length - index);
NSRange range = [self rangeOfString:str options:NSLiteralSearch range:fromRange];
if (range.location == NSNotFound) {
return JavaNotFound;
}
return range.location;
}
- (int) lastIndexOfChar:(unichar)ch {
int len = self.length;
for (int i = len-1; i >=0; --i) {
if ([self charAt:i] == ch) {
return i;
}
}
return JavaNotFound;
}
- (int) lastIndexOfChar:(unichar)ch fromIndex:(int)index {
int len = self.length;
if (index >= len) {
index = len - 1;
}
for (int i = index; i >= 0; --i) {
if ([self charAt:i] == ch) {
return index;
}
}
return JavaNotFound;
}
- (int) lastIndexOfString:(NSString*)str {
NSRange range = [self rangeOfString:str options:NSBackwardsSearch];
if (range.location == NSNotFound) {
return JavaNotFound;
}
return range.location;
}
- (int) lastIndexOfString:(NSString*)str fromIndex:(int)index {
NSRange fromRange = NSMakeRange(0, index);
NSRange range = [self rangeOfString:str options:NSBackwardsSearch range:fromRange];
if (range.location == NSNotFound) {
return JavaNotFound;
}
return range.location;
}
- (NSString *) substringFromIndex:(int)beginIndex toIndex:(int)endIndex {
if (endIndex <= beginIndex) {
return @"";
}
NSRange range = NSMakeRange(beginIndex, endIndex - beginIndex);
return [self substringWithRange:range];
}
- (NSString *) toLowerCase {
return [self lowercaseString];
}
- (NSString *) toUpperCase {
return [self uppercaseString];
}
- (NSString *) trim {
return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
- (NSString *) replaceAll:(NSString*)origin with:(NSString*)replacement {
return [self stringByReplacingOccurrencesOfString:origin withString:replacement];
}
- (NSArray *) split:(NSString*) separator {
return [self componentsSeparatedByString:separator];
}
@end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import <Foundation/Foundation.h>
#import "ImageSchema.h"
#import "FluwxKeys.h"
@interface FlutterAssetHelper : NSObject @end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import "FlutterAssetHelper.h"
@implementation FlutterAssetHelper
+ (NSString *)getPackageName:(NSString *)assetPath {
NSUInteger length = SCHEMA_ASSETS.length;
return @"";
}
+ (NSString *)getPath:(NSString *)assetPath {
NSUInteger schemaLength = SCHEMA_ASSETS.length;
NSUInteger totalLength = assetPath.length;
NSRange range = NSMakeRange(schemaLength, totalLength-schemaLength);
NSString *result = [assetPath substringWithRange:range];
if ([result rangeOfString:fluwxKeyPackage].location != NSNotFound) {
// result = [result stringByReplacingCharactersInRange:<#(NSRange)range#> withString:<#(NSString *)replacement#>]
}
return result;
}
@end
\ No newline at end of file
//
// Created by mo on 2018/8/21.
//
#import <Foundation/Foundation.h>
@interface ThumbnailHelper : NSObject
+ (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength isPNG:(BOOL)isPNG;
@end
\ No newline at end of file
//
// Created by mo on 2018/8/21.
//
#import "ThumbnailHelper.h"
@implementation ThumbnailHelper
+ (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
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论