因为软件需要,需要上传iOS相册原图,但是网上的资料也找了很多。获取到原图的话,我有两个思路,一个是根据ALAssetsLibrary里的ALAssetRepresentation:
ALAssetRepresentation *assetRep = [asset defaultRepresentation];
CGImageRef imgRef = NULL;
imgRef = [assetRep fullResolutionImage];
orientation = [assetRep orientation];
UIImage* image = [UIImage imageWithCGImage:imgRef scale:1.0f orientation:orientation];
data = UIImageJPEGRepresentation(image, 1.0f);
注意UIImageJPEGRepresentation , 后面的压缩比例,设为1.0是不压缩,但是这样转化过来的NSdata,都会比原图大,翻查了很多资料,因为fullResolutionImage 是高清原图,没经过处理的图片,这一种方法不行了。
第二个思路,获取到图片的相册原始路径 所以我找到了这个,NSURL *URL=[dict objectForKey:@"UIImagePickerControllerReferenceURL"]; 不管我怎么去拼接都无法获取到一个正确的路径,查了很多资料,都说iOS的机制是这样的,获取到的也只是相对路径所以这个思路也不行了
正确方法:
NSURL *imageAssetUrl = [dict objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:imageAssetUrl resultBlock:^(ALAsset *asset) {
ALAssetRepresentation* representation = [asset defaultRepresentation];
// 创建一个buffer保存图片数据
uint8_t *buffer = (Byte*)malloc(representation.size);
NSUInteger length = [representation getBytes:buffer fromOffset: 0.0 length:representation.size error:nil];
// 将buffer转换为NSData object,然后释放buffer内存
//这边获取到的NSdata 转化为图片后,参数信息,和占用内存都是一样了的,
data = [[NSData alloc] initWithBytesNoCopy:buffer length:representation.size freeWhenDone:YES];
//将对象存储到 NSUserDefaults 中 这边不用看 我是将多张图片写入本地沙盒
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
int last = [[user objectForKey:@"i"] intValue];
NSLog(@"%d",last);
int now=0;
if (last==0) {
last=1;
}
now=last+1;
[user setInteger:now forKey:@"i"];
filePath = [NSString stringWithFormat:@"%@/%@%03d.%@", docsPath, CDV_PHOTO_PREFIX, last++, @"jpg"];
NSLog(@"++%@",filePath);
[data writeToFile:filePath atomically:NO];
[resultStrings addObject:filePath];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OKmessageAsArray:resultStrings];
if (x==info.count-1) {
//完成
[self bbb:result];
}
} failureBlock:^(NSError *error) {
//失败的处理
}];
写的不明白的问题 可以加我的QQ 讨论 1627737545 (骚扰勿加,谢谢)