IPhoneアプリでフォトライブラリから画像を選択しています。実際の画像名を取得するにはどうすればよいですか。
.hクラス
UIImageView * imageView;
UIButton * choosePhotoBtn;
.mクラス
-(IBAction) getPhoto:(id) sender
{
UIImagePickerController * picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
if((UIButton *) sender == choosePhotoBtn)
{
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
else
{
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
[self presentModalViewController:picker animated:YES];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissModalViewControllerAnimated:YES];
imageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
}
画像の実際の名前を取得するにはどうすればよいですか?
私はiphoneの新人です。私を助けてください。
前もって感謝します。
ファイルにAssetsLibraryをインポートします。
_#import <AssetsLibrary/AssetsLibrary.h>
_
そして、- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
プット
_// get the ref url
NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL];
// define the block to call when we get the asset based on the url (below)
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *imageAsset)
{
ALAssetRepresentation *imageRep = [imageAsset defaultRepresentation];
NSLog(@"[imageRep filename] : %@", [imageRep filename]);
};
// get the asset library and fetch the asset based on the ref url (pass in block above)
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:refURL resultBlock:resultblock failureBlock:nil];
_
そのため、ログにイメージ名が表示されます。
*既存のフレームワークを追加することを忘れないでください:AssetsLibrary.framework手順:
ソース: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & Xcode 4に「既存のフレームワークを追加する」方法
IOS 9以降のターゲット向けにビルドしている場合は、ALAssetsLibraryで次のような非推奨の警告が多数表示されます。
'assetForURL(_:resultBlock:failureBlock :)'はiOS 9.0で廃止されました:PHAssetでfetchAssetsWithLocalIdentifiers:options:を使用して、ローカル識別子でアセットをフェッチします(または、既知のALAssetPropertyAssetURLでPHAssetsをルックアップして、フォトフレームワークからfetchAssetsWithALAssetURLs:options:を使用します)。代わりに
警告が示すように、PHAssetを使用する必要があります。たとえば、Swift 2.xを使用する場合、最初にimport Photos
をファイルに追加する必要があります。次に、didFinishPickingMediaWithInfo
UIImagePickerControllerDelegateメソッドでfetchAssetsWithALAssetURLs
ファイル名を取得するには:
if let imageURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
let result = PHAsset.fetchAssetsWithALAssetURLs([imageURL], options: nil)
let filename = result.firstObject?.filename ?? ""
}
これにより、filename
が「IMG_0007.JPG」のように設定されます。
シンプルSwift実装:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let referenceUrl = info[UIImagePickerControllerReferenceURL] as? NSURL {
ALAssetsLibrary().assetForURL(referenceUrl, resultBlock: { asset in
let fileName = asset.defaultRepresentation().filename()
//do whatever with your file name
}, failureBlock: nil)
}
}
}
について覚えておいてください:import AssetsLibrary
Objective Cで、Photosフレームワークを使用して、Photos/Photos.hをインポートします。
次に、imagePickerController関数に次を追加して、写真ライブラリから画像のファイル名を取得します。
NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL];
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[refURL] options:nil];
NSString *filename = [[result firstObject] filename];
最後のパスコンポーネントを取得してファイル名のように使用できる場合もありますが、そうすることはお勧めできません。これらのファイル名は、同期中にiTunesが理解できるようにシステムによって割り当てられ、将来の同期で他のいくつかの画像に置き換えられる可能性があるため、プログラマがアクセスするためのものではありません。
これについての良いラウンドは、ギャラリーから選択した画像に保存しながら、現在の日付をファイル名として割り当てることです。ドキュメントまたはライブラリディレクトリに保存し、マッピングPListファイルを使用して画像をファイル名にマッピングできます。
または、一意の番号をファイル名として割り当て、これらの値を使用して画像にアクセスすることもできます。
Objective Cで動作する実装iOS 1。 ALAssetsLibraryは廃止されているようですので、PHAssetを使用してください:
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
PHAsset *phAsset = [[PHAsset fetchAssetsWithALAssetURLs:@[imageURL] options:nil] lastObject];
NSString *imageName = [phAsset valueForKey:@"filename"];
UIImage *photo = [info valueForKey:UIImagePickerControllerOriginalImage];
NSLog(@"Picked image: %@ width: %f x height: %f",imageName, photo.size.width, photo.size.height);
[picker dismissViewControllerAnimated:YES completion:nil];
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
let imageUrl = info[UIImagePickerControllerReferenceURL] as! NSURL
let imageName = imageUrl.lastPathComponent
let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let photoURL = NSURL(fileURLWithPath: documentDirectory)
let localPath = photoURL.appendingPathComponent(imageName!)
let image = info[UIImagePickerControllerOriginalImage]as! UIImage
let data = UIImagePNGRepresentation(image)
do
{
try data?.write(to: localPath!, options: Data.WritingOptions.atomic)
}
catch
{
// Catch exception here and act accordingly
}
self.dismiss(animated: true, completion: nil);
}
var fileName: String = "Attachment"
if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL {
let assets = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil)
let assetResource = PHAssetResource.assetResources(for: assets.firstObject!)
fileName = assetResource.first?.originalFilename ?? "Attachment"
}
print(fileName)
Swift 3およびiOS8 +以降、.filenameにはアクセスできなくなりました。それはまだself.valueForKey( "filename")を通じて利用できますが、完全に合法ではありません。
しかし、私は this answer を質問 "iOS8 Photos Framework:How to get the name(or filename)of the PHAsset?" を短く、シンプルで合法であると見つけました。