【问题标题】:Image doesn't save from URL when using UIImage使用 UIImage 时,图像不会从 URL 保存
【发布时间】:2013-02-22 19:05:26
【问题描述】:

“img”实际上是一个带有URL的字符串,但我实际上也用它作为文件名

NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:img];

NSURL *url = [NSURL URLWithString:img];
NSData *imageData = [NSData dataWithContentsOfURL:url];  

[imageData writeToFile:storePath atomically:TRUE];

在我的视图控制器中,我得到了这个:

UIImage *img = [[UIImage alloc] initWithContentsOfFile:self.initialImg];
if(img == nil) NSLog(@"image is nil");
[self.image setImage:img];

"initialImg" 是一个 NSString,其 url 与 "img" 中的相同。我还用 test.png 之类的另一个字符串更改了“img”和“initialImg”,但这也不起作用。

它打印出“image is nil”,但不确定为什么它是 nil...

编辑:

现在我得到了:

        NSURL *url = [NSURL URLWithString:img];
    NSData *imageData = [NSData dataWithContentsOfURL:url]; 

    UIImage *uiImage=[UIImage imageWithData:imageData];

    NSData *pngData = UIImagePNGRepresentation(uiImage);
    NSString *documentsPath  = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; 
    [pngData writeToFile:filePath atomically:YES];

在另一个视图控制器中的 viewDidLoad 函数中:

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"image.png"];
    if(img == nil) NSLog(@"image is nil");

   [self.image setImage:img];

它仍然显示“图像为零”,我更改了网址,但它们是正确的

【问题讨论】:

  • 一般情况下你不能使用 URL 作为文件名(见stackoverflow.com/a/6114531/792677),贴一个你想使用的示例文件名,以便我们看看是不是这样。
  • 正如我所说,我已经尝试使用“test.png”对其进行更改,但它仍然显示图像为 nil
  • 如果你按照你说的做了(“用 test.png 之类的另一个字符串更改了“img”和“initialImg”),图像没有被下载,因为 test.png 不太可能是图像的有效 URL加载。请说明你做了什么。
  • 在 viewDidLoad 你做错了。您已将数据写入目录,因此首先读取数据然后转换为图像,因为您需要 filePath 不仅图像名称见我的答案

标签: ios objective-c


【解决方案1】:

我觉得这对你来说已经足够了……

NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:img];

NSURL *url = [NSURL URLWithString:img];
NSData *imageData = [NSData dataWithContentsOfURL:url];

[imageData writeToFile:storePath atomically:TRUE];

在 viewDidLoad 中
// 你需要 storePath 而不是 url

NSData *imageData = [NSData dataWithContentsOfFile:storePath];
UIImage *image = [UIImage imageWithData:imageData];

【讨论】:

    【解决方案2】:

    对于initWithContentsOfFile:,您应该提供整个文件路径。我认为您只提供文件名。
    试试案例

    NSString *initialImg= @"test.png";
    NSString *imagePath = [[NSBundle mainBundle]pathForResource:initialImg ofType:@"png"];
    UIImage *img = [[UIImage alloc] initWithContentsOfFile:imagePath];
    if(img == nil) NSLog(@"image is nil");
    [self.image setImage:img];
    

    否则你可以使用

    self.image =[UIImage imageNamed:@"test.png"]
    

    但它会导致性能问题

    回答您的问题

    //Write image data into document directory  
    
    NSData *pngData = UIImagePNGRepresentation(image);
    NSString *documentsPath  = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name
    [pngData writeToFile:filePath atomically:YES]; //Write the file
    
    
     // Read from directory using same file path 
    NSData *pngData = [NSData dataWithContentsOfFile:filePath];
    UIImage *image = [UIImage imageWithData:pngData];
    

    【讨论】:

    • 但我认为我没有使用 mainBundle?
    • @iosdevnyc 如果您使用 [UIImage imageNamed:] 它只知道图像名称。因此它将在整个捆绑包中搜索图像。它会影响性能。
    • 在您的回答中,您没有使用 URL,我从带有 NSData 的 URL 中获取这些图像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2011-09-22
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多