次のコードは、iCloud またはストリーム イメージにもあるイメージを読み込みます。検索をカメラ ロール内の画像のみに限定するにはどうすればよいでしょうか。
var assets = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: nil)
次のコードは、iCloud またはストリーム イメージにもあるイメージを読み込みます。検索をカメラ ロール内の画像のみに限定するにはどうすればよいでしょうか。
var assets = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: nil)
カメラ ロール アルバムとフォト ストリーム アルバムを追加した後、ApplePHAssetCollectionSubtype
は iOS 8.1 で次のタイプを追加しました。
PHAssetCollectionSubtypeAlbumMyPhotoStream
(と一緒にPHAssetCollectionTypeAlbum
) - フォト ストリーム アルバムを取得します。
PHAssetCollectionSubtypeSmartAlbumUserLibrary
(一緒にPHAssetCollectionTypeSmartAlbum
) - カメラ ロール アルバムを取得します。
ただし、これが iOS 8.0.x との下位互換性があるかどうかはテストしていません。
私のようにObjective Cコードを探していて、廃止されたAssetsLibraryのコードを取得していたために新しいライブラリ/フォトフレームワークの回答が得られなかった場合、これが役立ちます: Swift
グローバル変数:
func getAllPhotosFromCameraRoll() -> [UIImage] {
// TODO: Add `NSPhotoLibraryUsageDescription` to info.plist
PHPhotoLibrary.requestAuthorization { print($0) } // TODO: Move this line of code to somewhere before attempting to access photos
var images = [UIImage]()
let requestOptions: PHImageRequestOptions = PHImageRequestOptions()
requestOptions.resizeMode = .exact
requestOptions.deliveryMode = .highQualityFormat
requestOptions.isSynchronous = true
let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: nil)
let manager: PHImageManager = PHImageManager.default()
for i in 0..<fetchResult.count {
let asset = fetchResult.object(at: i)
manager.requestImage(
for: asset,
targetSize: PHImageManagerMaximumSize,
contentMode: .default,
options: requestOptions,
resultHandler: { (image: UIImage?, info: [AnyHashable: Any]?) -> Void in
if let image = image {
images.append(image)
}
})
}
return images
}
オブジェクティブ C
グローバル変数:
NSArray *imageArray;
NSMutableArray *mutableArray;
以下の方法が役立ちます:
-(void)getAllPhotosFromCamera
{
imageArray=[[NSArray alloc] init];
mutableArray =[[NSMutableArray alloc]init];
PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
requestOptions.synchronous = true;
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
NSLog(@"%d",(int)result.count);
PHImageManager *manager = [PHImageManager defaultManager];
NSMutableArray *images = [NSMutableArray arrayWithCapacity:[result count]];
// assets contains PHAsset objects.
__block UIImage *ima;
for (PHAsset *asset in result) {
// Do something with the asset
[manager requestImageForAsset:asset
targetSize:PHImageManagerMaximumSize
contentMode:PHImageContentModeDefault
options:requestOptions
resultHandler:^void(UIImage *image, NSDictionary *info) {
ima = image;
[images addObject:ima];
}];
}
imageArray = [images copy]; // You can direct use NSMutuable Array images
}
PHCachingImageManager
共有インスタンスの代わりに独自のインスタンスを使用する場合PHImageManager
は、呼び出し時にrequestImageForAsset:targetSize:contentMode:options:resultHandler:
オプションを設定しPHImageRequestOptions
て、イメージがローカルであることを指定できます。
networkAccessAllowed プロパティ
Photos が要求された画像を iCloud からダウンロードできるかどうかを指定するブール値。
ネットワークアクセス許可
討論
YES の場合、要求された画像がローカル デバイスに保存されていない場合、Photos は iCloud から画像をダウンロードします。ダウンロードの進行状況を通知するには、progressHandler プロパティを使用して、画像のダウンロード中にフォトが定期的に呼び出すブロックを提供します。NO (デフォルト) で、画像がローカル デバイスにない場合、結果ハンドラーの情報ディクショナリの PHImageResultIsInCloudKey 値は、ネットワーク アクセスを有効にしない限り、画像を使用できないことを示します。
これはAppleが提供するObjective-cバージョンです。
-(NSMutableArray *)getNumberOfPhotoFromCameraRoll:(NSArray *)array{
PHFetchResult *fetchResult = array[1];
int index = 0;
unsigned long pictures = 0;
for(int i = 0; i < fetchResult.count; i++){
unsigned long temp = 0;
temp = [PHAsset fetchAssetsInAssetCollection:fetchResult[i] options:nil].count;
if(temp > pictures ){
pictures = temp;
index = i;
}
}
PHCollection *collection = fetchResult[index];
if (![collection isKindOfClass:[PHAssetCollection class]]) {
// return;
}
// Configure the AAPLAssetGridViewController with the asset collection.
PHAssetCollection *assetCollection = (PHAssetCollection *)collection;
PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
self. assetsFetchResults = assetsFetchResult;
self. assetCollection = assetCollection;
self.numberOfPhotoArray = [NSMutableArray array];
for (int i = 0; i<[assetsFetchResult count]; i++) {
PHAsset *asset = assetsFetchResult[i];
[self.numberOfPhotoArray addObject:asset];
}
NSLog(@"%lu",(unsigned long)[self.numberOfPhotoArray count]);
return self.numberOfPhotoArray;
}
次の詳細を取得できる場所
PHFetchResult *fetchResult = self.sectionFetchResults[1];
PHCollection *collection = fetchResult[6];
**value 1,6 used to get camera images**
**value 1,0 used to get screen shots**
**value 1,1 used to get hidden**
**value 1,2 used to get selfies**
**value 1,3 used to get recently added**
**value 1,4 used to get videos**
**value 1,5 used to get recently deleted**
**value 1,7 used to get favorites**
アップルデモリンク
あなたの財産を宣言する
@property (nonatomic, strong) NSArray *sectionFetchResults;
@property (nonatomic, strong) PHFetchResult *assetsFetchResults;
@property (nonatomic, strong) PHAssetCollection *assetCollection;
@property (nonatomic, strong) NSMutableArray *numberOfPhotoArray;
I've been banging my head over this too. I've found no way to filter for only assets on the device with fetchAssetsWithMediaType or fetchAssetsInAssetCollection. I'm able to use requestContentEditingInputWithOptions or requestImageDataForAsset to determine if the asset is on the device or not, but this is asynchronous and seems like it's using way too much resources to do for every asset in the list. There must be a better way.
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
for (int i=0; i<[fetchResult count]; i++) {
PHAsset *asset = fetchResult[i];
[asset requestContentEditingInputWithOptions:nil
completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
if ([[info objectForKey:PHContentEditingInputResultIsInCloudKey] intValue] == 1) {
NSLog(@"asset is in cloud");
} else {
NSLog(@"asset is on device");
}
}];
}
ドキュメント化されていない API に依存したくない場合は、 を参照して[asset canPerformEditOperation:PHAssetEditOperationContent]
ください。これは、完全なオリジナルがデバイスで利用可能な場合にのみ true を返します。
確かにこれも脆弱ですが、テストではすべての assetSource タイプ (フォトストリーム、iTunes 同期など) で機能することが示されています。