通过 AFNetworking 下载图像并进行编辑

Posted

技术标签:

【中文标题】通过 AFNetworking 下载图像并进行编辑【英文标题】:Download image through AFNetworking & edit it 【发布时间】:2015-09-16 21:44:55 【问题描述】:

我正在尝试通过 AFNetworking (UIImageView+AFNetworking.h) 从远程服务器下载一些图像文件并从中检索 UIImage,编辑该图像。编辑意味着将该图像(下载的图像)添加到另一个 png 文件的顶部。(背景图像 - UIImage)

我尝试了几个代码块最后我被困在这里。我只得到一个黑匣子。看不到实际的服务器图像。

-(UIImage *)downloadImages:(NSString *)url

     UIImageView *downloadedImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,40,40)];

     [downloadedImageView setImageWithURL:[NSURL URLWithString:url]
                    placeholderImage:[UIImage imageNamed:@"Loading_image"]];

     UIGraphicsBeginImageContextWithOptions(downloadedImageView.bounds.size, downloadedImageView.opaque, 0.0);
    [downloadedImageView.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;

然后我在 for 循环中调用该函数。

for( int i=0;i<[Images count];i++)

  NSString *image_Url = [NSString stringWithFormat:@"%@%@",imageURL, imagename];  
  UIImage *downloadimage =[[UIImage alloc]init];

  downloadimage = [self downloadImages:image_Url];

  UIImage *bottomImage = [UIImage imageNamed:@"map_marker_black"];

  CGSize newSize = CGSizeMake(60, 60);
  UIGraphicsBeginImageContext( newSize );

  [backgroundImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

  [downloadimage drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.7];

  UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();


我哪里做错了?非常感谢您的帮助。非常感谢

【问题讨论】:

这里有很多问题。让我们从您实际尝试做的事情开始。您似乎下载了多张图片,而且捆绑包中有一张静态图片。您希望每个下载的图像都绘制在背景图像上,从而生成一个最终图像,还是想要一组新的图像 - 每个下载的图像一个? 感谢您的快速回复。我想从服务器下载多张图片..但是所有图片都将使用相同的(一张)背景图片,它们将被单独保存或返回.. 【参考方案1】:

几个问题。让我们从下载代码开始。没有理由处理图像视图并绘制它来创建图像。只需使用实际图像:

- (UIImage *)downloadImage:(NSString *)url
     NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
     UIImage *image = [UIImage imageWithData:imageData];

    return image;

原始代码的最大问题是您使用的 AFNetworking 方法在后台运行。所以你总是试图绘制“加载”图像。

现在绘制代码:

// Only need to load this once
UIImage *backgroundImage = [UIImage imageNamed:@"map_marker_black"];

// What is the loop used for?
for (NSUInteger i = 0; i < [Images count]; i++)
    // Where does imageURL and imagename come from?
    NSString *imageURL = [NSString stringWithFormat:@"%@%@",imageURL, imagename];
    UIImage *downloadImage = [self downloadImage:imageURL];

    CGRect newRect = CGRectMake(0, 0, 60, 60);
    UIGraphicsBeginImageContextWithOptions(newRect.size, NO, 0.0);

    [backgroundImage drawInRect:newRect];

    [downloadimage drawInRect:newRect blendMode:kCGBlendModeNormal alpha:0.7];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // Do something here with newImage

    UIGraphicsEndImageContext();

注意代码中的 cmets。

【讨论】:

是的..底部图像需要加载一次..这是正确的..我有一组图像名称,但是因为它们存储在一个位置,所以基本 url 或服务器 url 将是相同的..所以我正在从我的配置文件中加载“imageURL”并为其附加图像名称..我将运行此代码并检查... 虽然您将下载相同的图像[Images count] 次。 imageURL 不应该为每次迭代而改变吗? 是的 .. imageURL 应该在每次迭代中更改 .. 这就是为什么我将图像名称附加到基本 url .. 我不明白它还在下载一个图像吗??跨度> 这就是为什么我问“imagename”从何而来。您发布的代码不会尝试在循环的每次迭代中更改“imagename”。 我的回答有帮助吗?您对此还有什么问题吗?

以上是关于通过 AFNetworking 下载图像并进行编辑的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 使用 AFNetworking 获取图像保持缓存

使用 AFNetworking 进行图像缓存

AFNetworking 异步下载 GIF 带占位符

UITableViewAutomaticDimension + AFNetworking

AFNetworking 2.0 - 在监控进度的同时批量下载图像

使用 AFNetworking 2 高效下载大量图像 (1500+)