8

ユーザーがUIImagePickerControllerで写真を選択した後、サムネイルをUIImageViewに配置する方法のサンプルコードを説明または表示してもらえますか?

サムネイルをテーブルビューセルの画像として設定するとします。ユーザーがセルを押すと、画像ピッカーが表示され、ユーザーはすでにデバイス上にある画像を選択します。また、そのサムネイルへのパスを保存して、次にビューが表示されたときに適切なサムネイルが表示されるようにします。

画像ピッカーを表示でき、デリゲートは選択した画像を正しく取得しますが、サムネイルへのパスが必要であり、そのパスを使用してサムネイルをロードしたい(つまり、パスを保存したい)。私は今日何時間も検索しましたが、これを理解していません。おそらく私はALAssetを理解していないか、あるいはそれは何か他のものであるかもしれませんが、私を助けている例を見つけることができません。今までイメージピッカーやALAssetを使ったことがないので、まったく新しいです。

4

4 に答える 4

15

//これを読んでいて、以下のコメントを見て、??WTF??と思う場合 物事がよりきれいになることを期待して、2つの回答を投稿するのではなく、元の回答を編集しているためです。ALAssetsLibraryはiOS4.xのものであることを知っておくことが重要です。

以下のコードは、アセットライブラリのURLを取得し、サムネイル表現からUIImageを作成するように機能します。imageURL私はアセットライブラリのURLを直接使用していますが、この同じコードが、割り当てを満たすために文字列表現をNSURLに変換することから始められなかった理由はありません。免責事項:このコードはおそらくリークまたは何か悪いものですが、元の投稿者の質問に答えており、うまくいけば価値があります。

以下のコードは、基本的にこれと同じトピックをカバーするStackOverflowの質問を多用しています。ここのコードに加えて、他の質問で参照されているAssetsLibrary.frameworkとALAssetsLibrarytypedefを含めました。

全体の秘訣は、アセットライブラリからNSURLを直接参照できないことです。(わかりませんが)どういうわけかファイルではなくデータストアを参照しているので、URLから返されるデータはストレートNSDataではないので、古い方法で使用することはできません。

と呼ばれるコードにUIImageViewがありますphoto。うまくいけば、他のすべてが簡単に理解できます。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
    NSLog(@"%@",imageURL);
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {
        CGImageRef iref = [myasset thumbnail];
        if (iref) {
            UIImage *theThumbnail = [UIImage imageWithCGImage:iref];
            [[self photo] setImage:theThumbnail];

        }
    };


    ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
    {
        NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
    };

    if(imageURL)
    {
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:imageURL 
                       resultBlock:resultblock
                      failureBlock:failureblock];
    }

    [self dismissModalViewControllerAnimated:YES];
}

サムネイルは必要ないが写真全体が必要な場合は、AssetForURLResultブロックのコードを次のように変更します。

       ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];

その演習はユーザーに任せることができます。

頑張ってください、これがあなたのために物事を片付けるのに役立つことを願っています。

于 2011-01-12T01:52:28.700 に答える
2

私はそれをほとんど理解しました。私が抱えていた難しさは、ブロックを理解することでした。ほとんどの場合、ブロックの構文により、ブロックが何であるか、およびブロックがどのように機能するかを理解することが困難でした。

UIImagePickerControllerのデリゲートでは、ユーザーが画像を選択すると、次を使用してアセットライブラリ内の画像へのパスを取得できます。

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL];

そのオブジェクトでは、次のコードを使用してフルサイズの画像またはサムネイルを取得できます。

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    if (iref) {
        // Gets the full size image
        self.fullSizeImage = [UIImage imageWithCGImage:iref];
    }

    // Gets the thumbnail
    self.thumbnail = [UIImage imageWithCGImage:[myasset thumbnail]];
};

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
    NSLog(@"in failureblock, got an error: %@",[myerror localizedDescription]);
};

ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
[assetsLib assetForURL:urlForImage resultBlock:resultblock failureBlock:failureblock];

このページは、ブロックを理解するのに本当に役立ちました:iOS4のブロックiPhoneのALAssetから取得したURLからの画像の表示
も参照してください

于 2011-01-12T22:59:45.130 に答える
1

URLの保存には問題がある可能性があります。

  1. 少なくともiOS4.xでは、URLが一意であるとは限りません。ユーザーが写真を削除/追加した場合、それらは再利用できます。これは明らかに一般的です。したがって、保持したURLは、将来別の画像を指す可能性があります。
  2. ユーザーがiOS5にアップデートすると、URLは無効になります。UGH !!! Appleは、下位互換性なしでフォトライブラリを書き直しました。
于 2011-12-17T19:43:54.727 に答える
0

imagePickerから選択した画像を、ピッカーから参照する代わりにドキュメントディレクトリに保存できます。画像の保存に使用できるコードは次のとおりです。ユーザーがピッカーから写真を選択したときに呼び出されるコールバックメソッドにこのメソッドを実装します

 NSFileManager   fileManager    = [NSFileManager defaultManager];

    NSArray*  output_PDF_paths  =  NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString* output_PDF_documentsDirectory = [output_PDF_paths objectAtIndex:0];
    NSString* output_PDF_ABSOLUTE_PATH  = [output_PDF_documentsDirectory stringByAppendingPathComponent:@"ImageName.png"];  

    BOOL success_new = [UIImagePNGRepresentation(ProfilePhotoselected) writeToFile:previewPagePath atomically:YES];

//ここで、「ProfilePhotoselected」は、callabckメソッドの引数としてピッカーから取得した画像です。

于 2011-01-12T03:56:04.653 に答える