6

首先,我使用这种AFNetworking方法:

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

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

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

4

4 回答 4

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中吗?

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

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

无论如何,关于缓存的 AFNetworking 官方线路,我可能会向您推荐 AFNetworking FAQ中的缓存讨论。


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

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
                          }];
于 2013-07-16T12:55:08.573 回答
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;
    }

在这里,您将获得通过上述方法返回的裁剪图像;

或调整大小

并且还使用以下方法来调整 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,具有您想要的特定大小。

于 2013-07-16T12:01:02.533 回答
0

从 AFNetworking v.2.0 有AFCoreImageSerializer

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

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

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

于 2014-10-07T12:51:30.260 回答
0

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

这是AFImageResponseSerializer为了什么。只需更改图像比例以匹配您正在检索的图像比例。

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

于 2015-07-09T18:40:09.443 回答