diff --git a/TZImagePickerController/TZImagePickerController/TZAssetModel.h b/TZImagePickerController/TZImagePickerController/TZAssetModel.h index 05b8c7e1..745e9b33 100755 --- a/TZImagePickerController/TZImagePickerController/TZAssetModel.h +++ b/TZImagePickerController/TZImagePickerController/TZAssetModel.h @@ -20,7 +20,7 @@ typedef enum : NSUInteger { @class PHAsset; @interface TZAssetModel : NSObject -@property (nonatomic, strong) id asset; ///< PHAsset or ALAsset +@property (nonatomic, strong) id asset; ///< PHAsset, ALAsset, or UIImage (if bypassPhotoRoll is YES) @property (nonatomic, assign) BOOL isSelected; ///< The select status of a photo, default is No @property (nonatomic, assign) TZAssetModelMediaType type; @property (nonatomic, copy) NSString *timeLength; diff --git a/TZImagePickerController/TZImagePickerController/TZImageManager.m b/TZImagePickerController/TZImagePickerController/TZImageManager.m index 56b1251f..a748a581 100755 --- a/TZImagePickerController/TZImagePickerController/TZImageManager.m +++ b/TZImagePickerController/TZImagePickerController/TZImageManager.m @@ -553,7 +553,11 @@ - (int32_t)getPhotoWithAsset:(id)asset photoWidth:(CGFloat)photoWidth completion } }); }); - } + } else if ([asset isKindOfClass:[UIImage class]]) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (completion) completion(asset,nil,NO); + }); + } return 0; } @@ -608,7 +612,11 @@ - (void)getOriginalPhotoWithAsset:(id)asset newCompletion:(void (^)(UIImage *pho if (completion) completion(originalImage,nil,NO); }); }); - } + } else if ([asset isKindOfClass:[UIImage class]]) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (completion) completion(asset,nil,NO); + }); + } } - (void)getOriginalPhotoDataWithAsset:(id)asset completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion { @@ -629,7 +637,12 @@ - (void)getOriginalPhotoDataWithAsset:(id)asset completion:(void (^)(NSData *dat NSUInteger bufferSize = [assetRep getBytes:imageBuffer fromOffset:0.0 length:assetRep.size error:nil]; NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone:YES]; if (completion) completion(imageData,nil,NO); - } + } else if ([asset isKindOfClass:[UIImage class]]) { + UIImage *image = asset; + NSData *imageData = CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))); + if (completion) completion(imageData,nil,NO); + } + } #pragma mark - Save photo @@ -875,6 +888,9 @@ - (BOOL)isCameraRollAlbum:(id)metadata { } - (NSString *)getAssetIdentifier:(id)asset { + if ([asset isKindOfClass:[UIImage class]]) { + return [NSString stringWithFormat: @"%ld", (long) asset]; + } if (iOS8Later) { PHAsset *phAsset = (PHAsset *)asset; return phAsset.localIdentifier; @@ -895,6 +911,9 @@ - (BOOL)isPhotoSelectableWithAsset:(id)asset { } - (CGSize)photoSizeWithAsset:(id)asset { + if ([asset isKindOfClass:[UIImage class]]) { + return [(UIImage*) asset size]; + } if (iOS8Later) { PHAsset *phAsset = (PHAsset *)asset; return CGSizeMake(phAsset.pixelWidth, phAsset.pixelHeight); diff --git a/TZImagePickerController/TZImagePickerController/TZImagePickerController.h b/TZImagePickerController/TZImagePickerController/TZImagePickerController.h index 03642d12..747bcef4 100644 --- a/TZImagePickerController/TZImagePickerController/TZImagePickerController.h +++ b/TZImagePickerController/TZImagePickerController/TZImagePickerController.h @@ -102,11 +102,17 @@ /// 默认为YES,如果设置为NO, 选择器将不会自己dismiss @property(nonatomic, assign) BOOL autoDismiss; +/// Default is NO, if set YES, photos taken by the user are not added to the photo roll +@property(nonatomic, assign) BOOL bypassPhotoRoll; + /// The photos user have selected /// 用户选中过的图片数组 @property (nonatomic, strong) NSMutableArray *selectedAssets; @property (nonatomic, strong) NSMutableArray *selectedModels; +// Photos taken by the user, if bypassPhotoRoll is YES +@property (nonatomic, strong) NSMutableArray *privateModels; + /// Minimum selectable photo width, Default is 0 /// 最小可选中的图片宽度,默认是0,小于这个宽度的图片不可选中 @property (nonatomic, assign) NSInteger minPhotoWidthSelectable; diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m index 7ce38e06..010a3b04 100755 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m @@ -19,6 +19,8 @@ @interface TZPhotoPickerController () { NSMutableArray *_models; + NSMutableArray *_privateModels; // used if configured to bypass photo roll + UIView *_bottomToolBar; UIButton *_previewButton; @@ -722,17 +724,21 @@ - (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingM [imagePickerVc showProgressHUD]; UIImage *photo = [info objectForKey:UIImagePickerControllerOriginalImage]; if (photo) { - [[TZImageManager manager] savePhotoWithImage:photo location:self.location completion:^(NSError *error){ - if (!error) { - [self reloadPhotoArray]; - } - }]; + if (imagePickerVc.bypassPhotoRoll) { + [self reloadPhotoArrayAfterTakingImage:photo]; + } else { + [[TZImageManager manager] savePhotoWithImage:photo location:self.location completion:^(NSError *error){ + if (!error) { + [self reloadPhotoArrayAfterTakingImage:nil]; + } + }]; + } self.location = nil; } } } -- (void)reloadPhotoArray { +- (void)reloadPhotoArrayAfterTakingImage:(UIImage*) inImage { TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; [[TZImageManager manager] getCameraRollAlbum:tzImagePickerVc.allowPickingVideo allowPickingImage:tzImagePickerVc.allowPickingImage needFetchAssets:NO completion:^(TZAlbumModel *model) { _model = model; @@ -740,13 +746,20 @@ - (void)reloadPhotoArray { [tzImagePickerVc hideProgressHUD]; TZAssetModel *assetModel; - if (tzImagePickerVc.sortAscendingByModificationDate) { - assetModel = [models lastObject]; - [_models addObject:assetModel]; - } else { - assetModel = [models firstObject]; - [_models insertObject:assetModel atIndex:0]; - } + + if (inImage) { + assetModel = [TZAssetModel modelWithAsset:inImage type:TZAssetModelMediaTypePhoto]; + [_models addObject:assetModel]; + } + else { + if (tzImagePickerVc.sortAscendingByModificationDate) { + assetModel = [models lastObject]; + [_models addObject:assetModel]; + } else { + assetModel = [models firstObject]; + [_models insertObject:assetModel atIndex:0]; + } + } if (tzImagePickerVc.maxImagesCount <= 1) { if (tzImagePickerVc.allowCrop) { diff --git a/TZImagePickerController/ViewController.m b/TZImagePickerController/ViewController.m index 9bd071ee..aaf7cd53 100644 --- a/TZImagePickerController/ViewController.m +++ b/TZImagePickerController/ViewController.m @@ -164,7 +164,7 @@ - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPa ALAsset *alAsset = asset; isVideo = [[alAsset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]; } - if ([[asset valueForKey:@"filename"] tz_containsString:@"GIF"] && self.allowPickingGifSwitch.isOn && !self.allowPickingMuitlpleVideoSwitch.isOn) { + if (![asset isKindOfClass:[UIImage class]] && [[asset valueForKey:@"filename"] tz_containsString:@"GIF"] && self.allowPickingGifSwitch.isOn && !self.allowPickingMuitlpleVideoSwitch.isOn) { TZGifPhotoPreviewController *vc = [[TZGifPhotoPreviewController alloc] init]; TZAssetModel *model = [TZAssetModel modelWithAsset:asset type:TZAssetModelMediaTypePhotoGif timeLength:@""]; vc.model = model; @@ -493,8 +493,10 @@ - (void)imagePickerController:(TZImagePickerController *)picker didFinishPicking [self printAssetsName:assets]; // 2.图片位置信息 if (iOS8Later) { - for (PHAsset *phAsset in assets) { - NSLog(@"location:%@",phAsset.location); + for (id phAsset in assets) { + if ([phAsset isKindOfClass:[PHAsset class]]) { + NSLog(@"location:%@",[(PHAsset*)phAsset location]); + } } } }