通过 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 获取图像保持缓存
UITableViewAutomaticDimension + AFNetworking