使用AFNetworking加载图像 - 调整大小

时间:2013-07-16 11:56:46

标签: ios objective-c uiimageview afnetworking

首先,我正在使用这个AFNetworking方法:

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

1 - 此方法是异步的?它会将图像缓存在iPhone中吗?

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

4 个答案:

答案 0 :(得分:17)

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

  

这个方法是异步的吗?

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

[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
                          }];

答案 1 :(得分:2)

获取裁剪图片:

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;
    }

在这里你得到通过上述方法返回的Croped Image;

或重新调整

对于调整UII图像 图像,使用以下方法对特定的宽度

+ (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 ,具有您想要的特定大小。

答案 2 :(得分:0)

来自AFNetworking v.2.0,AFCoreImageSerializer

  

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

的实例      

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

您可以在设置为UIImageView之前使用此功能裁剪图像。

答案 3 :(得分:0)

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

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

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