【问题标题】:Cannot load image with the path URL returned by ALAssets无法使用 ALAssets 返回的路径 URL 加载图像
【发布时间】:2012-10-05 15:53:45
【问题描述】:

我正在使用 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 为空,我也尝试使用标准 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/

请帮忙,我被这个卡住了:-(

【问题讨论】:

    标签: iphone ios ipad


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果你已经有一个 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];
      

      【讨论】:

      • 抱歉,这不起作用。它会创建一个图像,是的,但是传入的最大尺寸没有任何作用——它只是返回一个非常大的图像。
      • 你是对的,下面是我在我的特殊情况下所做的,希望对某人有所帮助
      猜你喜欢
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2019-08-20
      • 2014-12-17
      • 2014-01-09
      • 2015-07-25
      相关资源
      最近更新 更多