uiimageViewに使用するために、uiimagepickercontrollerからサムネイルまたは保存可能なパスを取得するにはどうすればよいですか?
-
10-10-2019 - |
質問
ユーザーがuiimagepickercontrollerを使用して写真を選択した後、誰かがサムネイルを使用する方法のサンプルコードをuiimageviewに入れる方法のサンプルコードを説明しますか?
テーブルビューセルの画像としてサムネイルを設定したいとしましょう。ユーザーがセルを押すと、画像ピッカーが表示され、ユーザーはすでにデバイス上にある画像を選択します。また、そのサムネイルへのパスを保存して、次にビューが表示されると、適切なサムネイルが表示されるようにしたいと思います。
画像ピッカーを表示することができ、私のデリゲートは選択された画像を正しく取得しますが、サムネイルへのパスが必要であり、そのパスを使用してサムネイルをロードしたい(つまり、パスを保存したい)。今日は何時間も検索しましたが、これを理解していません。おそらく私はアラセットを理解していないか、またはそれは何か他のものですが、私を助けている例が見つかりません。私は今まで画像ピッカーやアラセットを使用したことがないので、私はこれで完全に新しいです。
解決
//これを読んで、以下のコメントを見て、考えてみてください?? wtf ??それは、物事がよりきれいになることを期待して2つの答えを投稿する代わりに、元の答えを編集しているからです。 AlassetsLibraryがiOS 4.xのものであることを知っておくことが重要です。
以下のコードは、資産ライブラリURLを取得し、サムネイル表現からUIIMAGEを作成するように機能します。 Asset-Library URLを直接使用していますが、この同じコードが文字列表現をNSURLに変換することで開始できない理由はありません。 imageURL
割り当て。免責事項:このコードはおそらく漏れているか、何か悪いことですが、元のポスターの質問に答えて、うまくいけば価値があります。
以下のコードは、tを大きく借りています彼のスタックオーバーフローの質問 それは基本的にこの同じトピックをカバーしています。ここのコードに加えて、私はAssetSlibrary.Frameworkと他の質問で参照されているAlassetSlibrary Typedefを含めました。
全体の秘Theは、Asset-Libraryから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];
}
サムネイルが必要であるが完全な写真が必要な場合は、Assetforurlsultブロックのコードを次のようなものに変更するだけです。
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
ユーザーのためにその運動を残すことができます。
頑張ってください、これがあなたのために物事を一掃するのに役立つことを願っています。
他のヒント
私はそれをほとんど理解しています。私が抱えていたのはブロックを理解することでしたが、ほとんどの場合、ブロックの構文は、それらが何であり、どのように機能するかを理解することを困難にしました。
UIImagePickerControllerの代表者では、ユーザーが画像を選択した場合、次のことを使用してAssets Libraryの写真へのパスを取得できます。
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];
このページは本当にブロックを理解するのに役立ちました: iOS 4のブロック
参照してください iPhoneのAlassetから取得したURLから画像を表示します
URLの保存は問題になる可能性があります:
- 少なくともiOS 4.xでは、URLは一意であることを保証されていません。ユーザーが画像を削除/追加すると再利用できますが、これは明らかに一般的です。したがって、あなたが保持していたURLは、将来的には別の写真を指すことができます!
- ユーザーがiOS 5に更新すると、URLは無効になります。うーん!!! Appleには、後方の互換性がなく、写真図書館が書き直されました。
選択した画像をImagePickerからDocuments Directoryに保存して、ピッカーから参照するディレクトリに保存できます。ここに、画像の保存に使用できるコードがあります。ユーザーがピッカーから写真を選択したときに呼び出されたコールバックメソッドにこのメソッドを実装する
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メソッドの議論としてピッカーから得た画像です