首先说明下上传gif图片,必须得到图片的NSData数据流,但是现有的直接转图片为数据流的方法
UIImagePNGRepresentation(<#UIImage * _Nonnull image#>)
UIImageJPEGRepresentation(model.image, 0.5)
并不适用于gif的图片,最后根据ALAsset(IOS8之前)和PHAsset(iOS8之后)俩种对象,去转化成数据流;针对这俩种情况,解决方案如下:
if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
for (int i=0; i<assets.count; i++) {
ALAsset * aset=assets[i];
ALAssetRepresentation *rep = [aset defaultRepresentation];
NSString * imageName=[rep filename];
if ([[imageName componentsSeparatedByString:@"."][1]isEqualToString:@"GIF"]) {
Byte *imageBuffer = (Byte*)malloc(rep.size);
NSUInteger bufferSize = [rep getBytes:imageBuffer fromOffset:0.0 length:rep.size error:nil];
NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone:YES];
ImageListModel *model = [[ImageListModel alloc] init];
model.imageData = imageData;
model.isGif=YES;
model.image = [UIImage imageWithData:imageData];
NSDictionary * dic=@{@"type":@"1",@"imageData":model.imageData,@"image":model.image};
[_imageDataArray addObject:dic];
[_uploadImagesArray addObject:model];
}
else
{
ImageListModel *model = [ImageListModel HModelInitWithUIImage:photos[i]];
NSDictionary * dic=@{@"type":@"2",@"imageData":@"" ,@"image":photos[i]};
[_imageDataArray addObject:dic];
[_uploadImagesArray addObject:model];
}
}
Save(_imageDataArray, @"images");
}
else
{
NSMutableArray * array=[self selectedAlbumPhotosIncludingGifWithPHAssets:assets];
for (int i=0; i<array.count; i++) {
[_uploadImagesArray addObject:array[i]];
}
}
if ([[UIDevice currentDevice].systemVersio<pre name="code" class="objc">***
* 选择相册图片(包括gif图片)
*
* @param assets PHAsset对象数组
*/
- (NSMutableArray *)selectedAlbumPhotosIncludingGifWithPHAssets:(NSArray*)assets {
NSMutableArray *imageArray = [NSMutableArray array];
CGSize targetSize = CGSizeMake(MAXFLOAT,MAXFLOAT);
PHImageRequestOptions *options = [PHImageRequestOptions new];
options.resizeMode = PHImageRequestOptionsResizeModeFast;
options.synchronous = YES;
PHCachingImageManager *imageManager = [[PHCachingImageManager alloc] init];
for (PHAsset *asset in assets) {
[imageManager requestImageDataForAsset:asset
options:options
resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
// DDLogDebug(@"dataUTI:%@",dataUTI);
//gif 图片
if ([dataUTI isEqualToString:(__bridge NSString *)kUTTypeGIF]) {
BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]);
if (downloadFinined && imageData) {
ImageListModel *model = [[ImageListModel alloc] init];
model.imageData = imageData;
model.image = [UIImage imageWithData:imageData];
model.isGif = YES;
[imageArray addObject:model];
NSDictionary * dic=@{@"type":@"1",@"imageData":model.imageData,@"image":model.image};
[_imageDataArray addObject:dic];
}
}
else {
//其他格式的图片,直接请求压缩后的图片
[imageManager requestImageForAsset:asset
targetSize:targetSize
contentMode:PHImageContentModeAspectFill
options:options
resultHandler:^(UIImage *result, NSDictionary *info) {
// 得到一张 UIImage,展示到界面上
NSNumber *isDegraded = info[PHImageResultIsDegradedKey];
if (!isDegraded.boolValue) {
// result = [self fixImageOrientation:result];
ImageListModel *model = [ImageListModel HModelInitWithUIImage:result];
[imageArray addObject:model];
NSDictionary * dic=@{@"type":@"2",@"imageData":@"" ,@"image":result};
[_imageDataArray addObject:dic];
}
}];
}
}];
}
Save(_imageDataArray, @"images");
return imageArray;
}
n floatValue] < 8.0) { for (int i=0; i<assets.count; i++) { ALAsset * aset=assets[i]; ALAssetRepresentation *rep = [aset defaultRepresentation]; NSString * imageName=[rep filename]; if ([[imageName componentsSeparatedByString:@"."][1]isEqualToString:@"GIF"]) { Byte *imageBuffer = (Byte*)malloc(rep.size); NSUInteger bufferSize = [rep getBytes:imageBuffer fromOffset:0.0 length:rep.size error:nil]; NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone:YES]; ImageListModel *model = [[ImageListModel alloc] init]; model.imageData = imageData; model.isGif=YES; model.image = [UIImage imageWithData:imageData]; NSDictionary * dic=@{@"type":@"1",@"imageData":model.imageData,@"image":model.image}; [_imageDataArray addObject:dic]; [_uploadImagesArray addObject:model]; } else { ImageListModel *model = [ImageListModel HModelInitWithUIImage:photos[i]]; NSDictionary * dic=@{@"type":@"2",@"imageData":@"" ,@"image":photos[i]}; [_imageDataArray addObject:dic]; [_uploadImagesArray addObject:model]; } } Save(_imageDataArray, @"images"); } else { NSMutableArray * array=[self selectedAlbumPhotosIncludingGifWithPHAssets:assets]; for (int i=0; i<array.count; i++) [_uploadImagesArray addObject:array[i]]; } }
以上为对gif图片NSData化,下面为上传部分:
[[AFHTTPRequestOperationManager manager] POST:phoneStr parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSString *timestamp = [NSString stringWithFormat:@"%.0f",[[NSDate date] timeIntervalSince1970]];
NSInteger index=0;
for (ImageListModel *model in _uploadImagesArray) {
if (model.isGif) { //gif图片
NSData *hdata=[NSData dataWithData:model.imageData];
GFLog(@"%@",hdata);
[formData appendPartWithFileData:model.imageData name:@"files" fileName:[NSString stringWithFormat:@"%@%@.gif",timestamp,@(index++)] mimeType:@"image/gif"];
GFLog(@"%@",(NSData *)model.imageData);
}
else
{
model.image=[self compressImageWith:model.image width:640.0 height:853];
[formData appendPartWithFileData:UIImageJPEGRepresentation(model.image, 0.5) name:@"files" fileName:[NSString stringWithFormat:@"%@_%@.png",timestamp,@(index++)] mimeType:@"image/png"];
}
}
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
<span style="font-size:24px;">此处为上传部分</span>