无法使用ALAssets返回的路径URL加载图像

时间:2012-01-18 06:17:39

标签: iphone ios ipad

我正在使用ALAssets在iPad上写一张图片。完成后,我尝试使用返回的URL创建一个UIImage,但不会加载。这是代码:

LAssetsLibrary *library = [[ALAssetsLibrary alloc] init];  
    [library writeImageToSavedPhotosAlbum:[anImage CGImage] orientation:(ALAssetOrientation)[anImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){  
        if (!error) {
            CGImageSourceRef src = CGImageSourceCreateWithURL((CFURLRef) [NSURL fileURLWithPath:[assetURL absoluteString]], NULL);

我的目的是将图像保存到设备,然后使用ImageIO将其转换为其他格式,最后将其发送到Web服务。 CGImageSourceRef为null,我也尝试使用标准的UIImage,结果相同。

我在这里做错了什么?

编辑:问题是在创建CFURLRef时。 如果我做

CGImageSourceCreateWithURL((CFURLRef) assetURL, NULL);

我收到了这个错误

ImageIO:CGImageSourceCreateWithURL CFURLCreateDataAndPropertiesFromResource失败,错误代码为-11。

但是,如果我尝试使用

转换网址
[NSURL fileURLWithPath:[assetURL absoluteString]]

路径更改为

assets-library:/asset/asset.JPG%3Fid=57BBBA99-E7BF-4DB7-839E-F915005E6DFA&ext=JPG -- file://localhost/

我找不到如何正确创建方法所需的CFURLRef。我尝试打印了我能想到的所有转换,这就是结果

[assetURL relativePath]
[assetURL relativeString]
[assetURL absoluteURL]
[assetURL absoluteString]
 /asset.JPG ,
 assets-library://asset/asset.JPG?id=57BBBA99-E7BF-4DB7-839E-F915005E6DFA&ext=JPG
 assets-library://asset/asset.JPG?id=57BBBA99-E7BF-4DB7-839E-F915005E6DFA&ext=JPG
 assets-library://asset/asset.JPG?id=57BBBA99-E7BF-4DB7-839E-F915005E6DFA&ext=JPG

[NSURL fileURLWithPath:[assetURL relativePath]]
[NSURL fileURLWithPath:[assetURL relativeString]]
[NSURL fileURLWithPath:[assetURL absoluteString]]
file://localhost/asset.JPG
assets-library:/asset/asset.JPG%3Fid=57BBBA99-E7BF-4DB7-839E-F915005E6DFA&ext=JPG -- file://localhost/
assets-library:/asset/asset.JPG%3Fid=57BBBA99-E7BF-4DB7-839E-F915005E6DFA&ext=JPG -- file://localhost/

请帮助,我坚持这个: - (

2 个答案:

答案 0 :(得分:0)

这就是我为我的案子所做的。

    UIImage* anImage;   //this is the original image    
    NSData * imgData = UIImageJPEGRepresentation(anImage, 0.7);
    CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef) imgData, NULL);

    NSMutableData *data = [NSMutableData data];
    CFStringRef imageType = CFSTR("com.microsoft.bmp");
    CGImageDestinationRef myImageDest = CGImageDestinationCreateWithData((CFMutableDataRef) data, imageType, 1, nil);

    //Convert!
    CGImageDestinationAddImageFromSource(myImageDest, src, 0, myOptions);
    CGImageDestinationFinalize(myImageDest);
    //Freeing things
    CFRelease(myImageDest);
    CFRelease(src);

但这只是转换图像,它不会将其存储在任何文件中......不确定这应该是原始问题的答案。

答案 1 :(得分:-1)

如果您已经有一个ALAsset并且您的目标是CGImageRef,那么您可以做这样的事情。

ALAssetRepresentation* rep = [asset defaultRepresentation];

NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
                         (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
                         (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageAlways, 
                         (id)[NSNumber numberWithDouble:400], (id)kCGImageSourceThumbnailMaxPixelSize, 
                         nil];

CGImageRef image = [rep CGImageWithOptions:options];