ユーザーの介入なしに、カメラロール内の最新の写真をプログラムで取得する方法を理解するのに苦労しています。明確にするために、私はイメージピッカーを使用したくありません。アプリが開いたときにアプリが自動的に最新の写真を取得するようにしたいのです。
同様のアプリがそれを行うのを見たので、これが可能であることは知っていますが、それに関する情報を見つけることができないようです。
ユーザーの介入なしに、カメラロール内の最新の写真をプログラムで取得する方法を理解するのに苦労しています。明確にするために、私はイメージピッカーを使用したくありません。アプリが開いたときにアプリが自動的に最新の写真を取得するようにしたいのです。
同様のアプリがそれを行うのを見たので、これが可能であることは知っていますが、それに関する情報を見つけることができないようです。
1つの方法は、AssetsLibraryを使用し、列挙のインデックスとしてn-1を使用することです。
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (nil != group) {
// be sure to filter the group so you only get photos
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
if (group.numberOfAssets > 0) {
[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:group.numberOfAssets - 1]
options:0
usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (nil != result) {
ALAssetRepresentation *repr = [result defaultRepresentation];
// this is the most recent saved photo
UIImage *img = [UIImage imageWithCGImage:[repr fullResolutionImage]];
// we only need the first (most recent) photo -- stop the enumeration
*stop = YES;
}
}];
}
}
*stop = NO;
} failureBlock:^(NSError *error) {
NSLog(@"error: %@", error);
}];
Swift 3.0:
1) クラス宣言の前にヘッダーに Photos フレームワークをインポートします。
import Photos
2) 最後の画像を返す次のメソッドを追加します。
func queryLastPhoto(resizeTo size: CGSize?, queryCallback: @escaping ((UIImage?) -> Void)) {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
if let asset = fetchResult.firstObject {
let manager = PHImageManager.default()
let targetSize = size == nil ? CGSize(width: asset.pixelWidth, height: asset.pixelHeight) : size!
manager.requestImage(for: asset,
targetSize: targetSize,
contentMode: .aspectFit,
options: requestOptions,
resultHandler: { image, info in
queryCallback(image)
})
}
}
3) 次に、このメソッドをアプリのどこかで呼び出します (おそらくボタン アクション)。
@IBAction func pressedLastPictureAttachmentButton(_ sender: Any) {
queryLastPhoto(resizeTo: nil){
image in
print(image)
}
}
Art Gillespie の回答に追加するにfullResolutionImage
は、元の画像を使用すると、写真を撮るときのデバイスの向きによっては、逆さままたは-90°の画像が残る可能性があります。
このために変更されたが最適化された画像を取得するには、fullScreenImage
代わりに....を使用します。
UIImage *img = [UIImage imageWithCGImage:[repr fullScreenImage]];