SDWebImage 修改缓存图片大小以及从缓存中获取图片资源

SDWebImage经常用于iOS开发中的图片缓存加载,加载中先是通过SDImageCache从内存中查找是否有图片,将URL作为图片资源在内存中的唯一索引来进行查找。有缓存,则通过代理进行回调展示图片。无,则通过NSURLConnection来进行下载,下载完成后会保存在内存中。

  • 修改缓存图片大小
    实际开发中,有可能因为服务器的的图片尺寸过大,用SDWebImage进行下载原图会造成内存崩溃。例如:Received memory warning.Message from debugger: Terminated due to memory issue.直接导致程序闪退,或者机器重启。

1.在SDWebImage包中找到 UIImage+MultiFormat.m
2.添加修改图片的类方法,代码如下:

+(UIImage *)compressImageWith:(UIImage *)image
{
    //具体大小可以根据实际需求进行修改
    float imageWidth = image.size.width;
    float imageHeight = image.size.height;
    float width = 640;
    float height = image.size.height/(image.size.width/width);

    float widthScale = imageWidth /width;
    float heightScale = imageHeight /height;

    // 创建一个bitmap的context
    // 并把它设置成为当前正在使用的context
    UIGraphicsBeginImageContext(CGSizeMake(width, height));

    if (widthScale > heightScale) {
        [image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];
    }
    else {
        [image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];
    }

    // 从当前context中创建一个改变大小后的图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // 使当前的context出堆栈
    UIGraphicsEndImageContext();

    return newImage;

}

3.在 + (UIImage )sd_imageWithData:(NSData )data 方法中,进行修改 代码如下:

+ (UIImage *)sd_imageWithData:(NSData *)data {
    if (!data) {
        return nil;
    }

    UIImage *image;
    NSString *imageContentType = [NSData sd_contentTypeForImageData:data];
    if ([imageContentType isEqualToString:@"image/gif"]) {
        image = [UIImage sd_animatedGIFWithData:data];
    }
#ifdef SD_WEBP
    else if ([imageContentType isEqualToString:@"image/webp"])
    {
        image = [UIImage sd_imageWithWebPData:data];
    }
#endif
    else {
        image = [[UIImage alloc] initWithData:data];
        //修改的地方
        if (data.length/1024 > 128) {
            image = [self compressImageWith:image];
        }

        UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];
        if (orientation != UIImageOrientationUp) {
            image = [UIImage imageWithCGImage:image.CGImage
                                        scale:image.scale
                                  orientation:orientation];
        }
    }


    return image;
}
  • 从缓存中获取图片资源
    有时候缓存中有很多图片资源,我们想单独的去取一张或者多张图片时候,又不想去再次下载。这个时候我们可以通过目标图片的URL作为在SDImageCache内存中的唯一索引去查找。
UIImageView *longPressView = [[UIImageView alloc] init];
NSString *URL = @"http://xxx/image/xx";
UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:URL];
longPressView.image = cachedImage;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值