照片库图像 URL “assets-library://asset/asset.JPG?id=1000000007&ext=JPG”为 nil

Posted

技术标签:

【中文标题】照片库图像 URL “assets-library://asset/asset.JPG?id=1000000007&ext=JPG”为 nil【英文标题】:Photo Library Image URL "assets-library://asset/asset.JPG?id=1000000007&ext=JPG" is nil 【发布时间】:2017-02-13 06:22:06 【问题描述】:

我想从 iPad 的照片库中获取图像 URL。

当我试图从 Image Piicker 的信息中获取 UIImagePickerControllerReferenceURL 时 我得到的网址为:

 assets-library://asset/asset.JPG?id=1000000007&ext=JPG

因为我想在不加载到内存的情况下获取图像元数据(image height,width and size in MB)

我试过下面的代码:

 -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
    
        NSURL *mediaURL;
        mediaURL=(NSURL*)[info valueForKey:UIImagePickerControllerMediaURL];
        NSURL *imageFileURL = (NSURL*)[info valueForKey:UIImagePickerControllerReferenceURL];

        NSLog(@" referenURL %@  mediaURL %@" ,imageFileURL,mediaURL);

        //We can get Image property from imagepath.
        //NSURL *imageFileURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@",_directoryPath,roomImageNames[i]]];
        CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageFileURL, NULL);
        NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);

        CGFloat height = [[properties objectForKey:@"PixelHeight"] floatValue];
        CGFloat width = [[properties objectForKey:@"PixelWidth"] floatValue];
        NSLog(@"height %f  width  %f",height ,width);

我将图像高度和宽度设为 0.0

如果我做错了什么,请告诉我。

【问题讨论】:

如果没有保存你还没有url。 【参考方案1】:

ios8以后,你应该使用Photos.framework访问系统照片库。

单张照片模型是一个PHAsset 实例对象。它具有pixelWidthpixelHeight 属性,用于存储当前照片的尺寸信息。通过这些信息,你可以计算出它的内存大小。

【讨论】:

【参考方案2】:

这些函数允许您访问某些图像元数据,而无需将实际像素数据加载到内存中。例如,获取像素尺寸的工作方式如下(确保在您的目标中包含 ImageIO.framework):

#import <ImageIO/ImageIO.h>

NSURL *imageFileURL = [NSURL fileURLWithPath:...];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL);
if (imageSource == NULL) 
    // Error loading image
    ...
    return;


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,
                         nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
if (imageProperties) 
    NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
    NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
    NSLog(@"Image dimensions: %@ x %@ px", width, height);
    CFRelease(imageProperties);

CFRelease(imageSource);

更多详情:Accessing Image Properties Without Loading the Image Into Memory

【讨论】:

以上是关于照片库图像 URL “assets-library://asset/asset.JPG?id=1000000007&ext=JPG”为 nil的主要内容,如果未能解决你的问题,请参考以下文章

在 UIWebView img 标签中使用 ALAsset 照片

获取新创建资产的 URL,iOS 9 风格

iPhone:存储相册图像 URL 并稍后比较:

Instagram 挂钩预选媒体问题

将图像保存到照片库并获取保存图像的 URL

如何使用传入的图像 URL 将图像从 iOS 上传到 DropBox?