web-dev-qa-db-ja.com

iPhoneのフォトライブラリから選択した画像の名前を取得するにはどうすればよいですか?

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の新人です。私を助けてください。

前もって感謝します。

24
Sandeep Singh

ファイルに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手順:

  1. プロジェクトナビゲーターで、プロジェクトを選択します
  2. ターゲットを選択してください
  3. 「ビルドフェーズ」タブを選択します
  4. 「Link Binaries With Libraries」エキスパンダーを開く
  5. 「+」ボタンをクリックします
  6. フレームワークを選択してください
  7. (オプション)追加したフレームワークを「Frameworks」グループにドラッグアンドドロップします

ソース: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901Xcode 4に「既存のフレームワークを追加する」方法

68
Joanne

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」のように設定されます。

9
parag

シンプル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];
5
Heiko Hoffmann

最後のパスコンポーネントを取得してファイル名のように使用できる場合もありますが、そうすることはお勧めできません。これらのファイル名は、同期中にiTunesが理解できるようにシステムによって割り当てられ、将来の同期で他のいくつかの画像に置き換えられる可能性があるため、プログラマがアクセスするためのものではありません。

これについての良いラウンドは、ギャラリーから選択した画像に保存しながら、現在の日付をファイル名として割り当てることです。ドキュメントまたはライブラリディレクトリに保存し、マッピングPListファイルを使用して画像をファイル名にマッピングできます。

または、一意の番号をファイル名として割り当て、これらの値を使用して画像にアクセスすることもできます。

2
Shyam Bhat

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];
}
1
Ispas Claudiu
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);
}
0
Sami Yousif
 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)
0
Kiran S

Swift 3およびiOS8 +以降、.filenameにはアクセスできなくなりました。それはまだself.valueForKey( "filename")を通じて利用できますが、完全に合法ではありません。

しかし、私は this answer を質問 "iOS8 Photos Framework:How to get the name(or filename)of the PHAsset?" を短く、シンプルで合法であると見つけました。

0
Vitalii