8

有人可以解释或显示一些示例代码,说明在用户使用 UIImagePickerController 选择照片后如何使用获取缩略图放入 UIImageView 吗?

假设我想将缩略图设置为表格视图单元格的图像。当用户按下单元格时,将显示图像选择器并且用户选择其设备上已经存在的图像。我还想保存该缩略图的路径,以便下次显示视图时,可以显示正确的缩略图。

我能够显示图像选择器,并且我的代表正确地获取了选择的图像,但我想要缩略图的路径,并且我想使用该路径加载缩略图(即我想保存路径)。我今天已经搜索了几个小时,但还没有弄清楚。也许我不了解 ALAsset,或者可能是别的东西,但我找不到任何对我有帮助的例子。我以前从未使用过图像选择器或 ALAsset,所以我对此完全陌生。

4

4 回答 4

15

//如果您正在阅读本文并查看下面的评论并思考??WTF??这是因为我正在编辑我的原始答案而不是发布两个答案,希望事情会更干净。重要的是要知道 ALAssetsLibrary 是 iOS 4.x 的东西。

下面的代码将用于获取资产库 URL,然后从缩略图表示中生成 UIImage。虽然我直接使用资产库 url,但没有理由不能通过将字符串表示形式转换为 NSURL 来满足imageURL分配的相同代码。免责声明:此代码可能会泄漏或更糟,但它回答了原始发布者的问题,并希望具有价值。

下面的代码大量借鉴了他的 Stack Overflow 问题,该问题基本上涵盖了相同的主题。除了这里的代码,我还包括了 AssetsLibrary.framework 和另一个问题中引用的 ALAssetsLibrary typedef。

整个技巧是您不能直接从资产库中引用 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];

这个页面真的帮助我理解了 Blocks: Blocks in iOS 4
See also display image from URL retrieved from ALAsset in iPhone

于 2011-01-12T22:59:45.130 回答
1

保存 URL 可能会出现问题:

  1. 至少在 iOS 4.x 中,不能保证 URL 是唯一的。如果用户删除/添加图片,它们可以重复使用,这显然很常见。因此,您保留的 URL 将来可以指向不同的图片!
  2. 当用户更新到 iOS 5 时,URL 不再有效。啊!!!苹果已经重写了照片库,没有向后兼容性。
于 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 回答