【问题标题】:Loading image with AFNetworking - Resizing使用 AFNetworking 加载图像 - 调整大小
【发布时间】:2013-07-14 14:20:51
【问题描述】:

首先,我使用的是AFNetworking这个方法:

[imageView setImageWithURL:[NSURL URLWithString:@"http://site.com/img.png"]];

1 - 这个方法是异步的吗?会在 iPhone 中缓存图片吗?

2 - 如何裁剪/调整此图像的大小?我在 URL 中有一个 800x600 的图像,但我的 UIImageView 是 400x400,我只想在显示之前裁剪 url 图像,使其比例相同,例如 600x600(不需要是 400x400,只需相同的比例)。喜欢 Facebook 应用程序。

【问题讨论】:

  • 下载图片后可以裁剪。用于裁剪see here
  • 在调整图像大小时,如果你有一些有用的东西,那很好,但如果没有,我可能会建议 scaleImageToSizeAspectFit 方法,如 this category 所示。

标签: ios objective-c uiimageview afnetworking


【解决方案1】:

我有一个代码示例要添加到 Hemang 的答案中。

这就是AFImageResponseSerializer 的用途。只需更改图像比例以匹配您正在检索的图像比例。

AFImageResponseSerializer *imageResponseSerializer = [self.avatarImageView imageResponseSerializer]; [imageResponseSerializer setImageScale:1.0];

【讨论】:

    【解决方案2】:

    从 AFNetworking v.2.0 开始,AFCoreImageSerializer

    用于从服务器响应和响应数据创建图像表示的响应序列化程序。默认情况下,这是AFImageResponseSerializer的实例

    AFImageResponseSerializer 的子类可用于执行后处理,例如颜色校正、人脸检测或其他效果。

    您可以在设置为UIImageView之前使用它来裁剪图像。

    【讨论】:

      【解决方案3】:

      调整大小已在其他地方得到解答,但针对您的第一个问题:

      这个方法是异步的吗?

      是的,它是异步的。如果要处理图像,可以使用回调块,例如:

      [imageView setImageWithURLRequest:request
                       placeholderImage:nil
                                success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
      
                                    // do image resize here
      
                                    // then set image view
      
                                    imageView.image = image;
                                }
                               failure:nil];
      

      然后你问:

      它会将图像缓存在 iPhone 中吗?

      如果您只是出于性能原因而在内存中缓存,那么答案是肯定的。它使用NSCache(将在内存压力下清空)。顺便说一句,它会将检索到的图像缓存起来,而不是反映您事后所做的任何调整。

      如果您希望缓存在持久性存储中(即即使您终止应用并重新启动它也会持续存在的缓存),那么这个问题就不太清楚了。 AFNetworking 声称通过使用NSURLCache 来支持磁盘缓存,但我在让它在iOS 上工作时遇到了问题。如果您需要持久存储缓存,我可能会建议使用其他各种UIImageView 类别,例如SDWebImage

      无论如何,关于缓存的 AFNetworking 官方线路,我可能会向您推荐 AFNetworking 常见问题解答中的 Caching 讨论。


      如果你想要一个活动指示器视图,你可以:

      UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
      activityIndicatorView.center = self.imageView.center;
      [self.view addSubview:activityIndicatorView];
      [activityIndicatorView startAnimating];
      
      [imageView setImageWithURLRequest:request
                       placeholderImage:nil
                                success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
      
                                    [activityIndicatorView removeFromSuperview];
      
                                    // do image resize here
      
                                    // then set image view
      
                                    imageView.image = image;
                                }
                                failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                                    [activityIndicatorView removeFromSuperview];
      
                                    // do any other error handling you want here
                                }];
      

      【讨论】:

      • 另一个问题:placeholderImage 可能是一个activityindicator GIF?
      • @DanielCampos 我可能会建议 UIActivityIndicatorView,而不是动画 GIF。请参阅修改后的答案。
      • 嗨,Rob,我明白了一切,这太棒了。但在我的情况下,会有很多 UIImageViews,比如 Instagram 应用程序,我希望在所有 UIImageViews 中间有一个 activityindicador,因为我认为 gif 是最有效的解决方案。你同意吗?
      • @DanielCampos 就个人而言,我可能会坚持使用UIActivityIndicatorView,但这取决于你。如果我真的想给我的微调器一些非标准的外观,我可能倾向于使用UIImage 方法animatedImage...,但尝试两种方法,看看哪种方法最适合你。
      • 顺便说一句,拥有一堆活动指标(无论您如何实施)可能会分散注意力。许多应用程序只会将图像留空,并在下载图像时优雅地淡入图像。那可能更优雅。
      【解决方案4】:

      获取裁剪图像:

      UIImage *croppedImg = nil;
      CGRect cropRect = CGRectMake(AS YOu Need);
      croppedImg = [self croppIngimageByImageName:self.imageView.image toRect:cropRect];
      

      使用下面的方法返回UIImage你想要的图像大小

      - (UIImage *)croppIngimageByImageName:(UIImage *)imageToCrop toRect:(CGRect)rect
          {
              //CGRect CropRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height+15);
      
              CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
              UIImage *cropped = [UIImage imageWithCGImage:imageRef];
              CGImageRelease(imageRef);
      
              return cropped;
          }
      

      这里你会得到通过上述方法返回的裁剪图像;

      或调整大小

      对于特定的 hightwidth 以及 image 使用以下方法Resizing UIImage

      + (UIImage*)resizeImage:(UIImage*)image withWidth:(int)width withHeight:(int)height
      {
          CGSize newSize = CGSizeMake(width, height);
          float widthRatio = newSize.width/image.size.width;
          float heightRatio = newSize.height/image.size.height;
      
          if(widthRatio > heightRatio)
          {
              newSize=CGSizeMake(image.size.width*heightRatio,image.size.height*heightRatio);
          }
          else
          {
              newSize=CGSizeMake(image.size.width*widthRatio,image.size.height*widthRatio);
          }
      
      
          UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
          [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
          UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
      
          return newImage;
      }
      

      此方法返回 NewImage,具有您想要的特定大小。

      【讨论】:

      • 这个方法很棒。但是需要在方法声明的开头使用“+”而不是“-”吗?
      • 然后改变符号,你需要通过类名调用这个方法它的调用静态方法
      • “+”是公共函数,“-”是私有函数。
      • @olamarche close,“+”表示类方法,“-”表示实例方法。一个我们都知道并喜欢的类方法 [NSString stringWithFormat:](注意它是在类 NSString 上调用的),其中 NSString 的实例方法是 [instanceOfString characterAtIndex:] 将在 NSString 的实例上调用以获取字符该特定字符串的索引。
      • 你好@iPatel 我的脑海中出现了一个小问题。如果我从远程服务器获取字符串,我该如何使用你的代码?请帮助我,我坚持下去
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2015-12-29
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多