有人可以解释或显示一些示例代码,以便在用户选择使用uiimagePickerController的照片之后,我如何使用将缩略图放入UIImageView中?

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

我能够正确地显示一个图像选择器,我的代表可以正确地获得所选的图像,但是我想要通往缩略图的路径,并且我想使用该路径加载缩略图(即我想保存路径)。我今天搜索了几个小时,但还没有解决这个问题。也许我不了解Alasset,或者也许是其他的,但是我找不到任何帮助我的例子。我以前从未使用过图像选择器或Alasset,所以我完全是新手。

有帮助吗?

解决方案

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

下面的代码将起作用以获取资产图形URL,然后从缩略图表示中进行uiimage。尽管我直接使用资产库URL,但是没有理由将同一代码无法开始,将字符串表示形式转换为nsurl以满足 imageURL 任务。免责声明:此代码可能泄漏或更糟,但它回答了原始海报的问题,并希望有价值。

下面的代码在T上大量借用他的堆栈溢出问题 这基本上涵盖了同一主题。除了这里的代码外,我还包括了AssetSlibrary.framework和另一个问题中引用的AlassetSlecrary typedefs。

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

我们可以为用户留下练习。

祝您好运,希望这有助于您为您清除事情。

其他提示

我现在大部分时间都弄清楚了。我遇到的困难是了解块,主要是块的语法使得很难理解它们是什么以及它们的工作方式。

在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];

此页面确实帮助我理解了块: iOS 4中的块
也可以看看 从iPhone中从Alexet检索到的URL显示图像

保存URL可能是有问题的:

  1. 至少在iOS 4.X中,URL不能保证是唯一的。如果用户删除/添加图片,可以重复使用它们,这显然很常见。因此,您保留的URL将来可以指出不同的图片!
  2. 当用户更新iOS 5时,URL不再有效。啊!!! Apple重写了照片库,没有向后兼容。

您可以将您从ImagePicker选择的图像保存到文档目录中,从Picker引用它的目录这是您可以使用用于保存图像的代码。当用户从选择器中选择照片时,在调用的回调方法中实现此方法

 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];

//这里的“ profilephotoselectected”是您从callabck方法中作为参数获得的图像

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top