第七篇OC_图片的裁剪基于SDWebImage

Posted 久冬不雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七篇OC_图片的裁剪基于SDWebImage相关的知识,希望对你有一定的参考价值。

前期有段时间困扰了我很久一个问题由于工程中的图片数据抓取自不同平台,所以图片的大小尺寸不一定,而放置图片的imageView尺寸是一定的,不作任何处理的话会导致图片拉伸变形,因此找了好久解决办法,现把它拿出来。

 

#import <UIKit/UIKit.h>
#import "UIImageView+WebCache.h"

@interface UIImageView (WebImage)

/**
 *  @author Tucai, 16-02-23 12:02:53
 *
 *  设置能够自动裁剪的网络图,基于SDWebImage实现
 *
 */

// 模糊图渲染
- (void)renderBlurredImageWithUrl:(NSString *)url placeholder:(UIImage *)placeholder completed:(imageDownloadCompletedBlock) completedBlock;

//按比例缩放网络图片

- (void)yg_setTrimImageWithUrl:(NSString *)url placeholderImage:(UIImage *)placeholder;

 

#import "UIImageView+WebImage.h"
#import "NSString+URLEncoding.h"
@implementation UIImageView (WebImage)

#pragma mark - 模糊图渲染

- (void)renderBlurredImageWithUrl:(NSString *)url placeholder:(UIImage *)placeholder completed:(imageDownloadCompletedBlock) completedBlock
{
    // 这里必须开启内存缓存
    [SDWebImageManager sharedManager].imageCache.shouldCacheImagesInMemory = YES;

    // 渲染背景
    __weak typeof(self) ws = self;
    [ws sd_setImageWithURL:[NSURL URLWithString:url] completed:^(UIImage *webImage, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        // 999 是一个标记
        if (ws.tag != 999) {
            UIVisualEffectView *visualView = [[UIVisualEffectView alloc] initWithFrame:ws.bounds];
            UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
            visualView.effect = effect;
            NSLog(@"only once");
            [ws addSubview:visualView];
            ws.tag = 999;
        }
        ws.alpha =0.6;
        ws.image = nil;
        ws.image = webImage;
        if (completedBlock) {
            completedBlock(webImage);
        }
    }];
}

#pragma mark - 裁剪图片

- (void)yg_setTrimImageWithUrl:(NSString *)url placeholderImage:(UIImage *)placeholder{

    __weak typeof(self) ws = self;
        [SDWebImageManager sharedManager].imageCache.shouldCacheImagesInMemory = NO;

    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        if (image) {
            UIImage *img=[self yg_trimImageWithImage:image];
            ws.image=img;
        }else{
            ws.image =[self yg_trimImageWithImage:placeholder];
        }
    }];
}

-(UIImage *)yg_trimImageWithImage:(UIImage *)image{

    //imageView的宽高比
    CGFloat imageViewWidthHeightRatio =self.frame.size.width/self.frame.size.height;
    //屏幕分辨率
//    CGFloat imageScale = [[UIScreen mainScreen] scale];

    CGFloat imageScale = 1;

    CGFloat imageWith = image.size.width*imageScale;

    CGFloat imageHeight =image.size.height*imageScale;

    //image的宽高比
    CGFloat imageWidthHeightRatio =imageWith/imageHeight;

    CGImageRef imageRef = nil;

    CGRect rect;

//    NSLog(@"\nimageWith === %f\nimageHeight === %f\nImageView宽高比 == %f\nimageScale == %f",imageWith,imageHeight,imageViewWidthHeightRatio,imageScale);


    if (imageWidthHeightRatio>imageViewWidthHeightRatio) {

        rect = CGRectMake((imageWith-imageHeight*imageViewWidthHeightRatio)/2, 0, imageHeight*imageViewWidthHeightRatio, imageHeight);

    }else if (imageWidthHeightRatio<imageViewWidthHeightRatio) {

        rect = CGRectMake(0, (imageHeight-imageWith/imageViewWidthHeightRatio)/2, imageWith, imageWith/imageViewWidthHeightRatio);

    }else {
        rect = CGRectMake(0, 0, imageWith, imageHeight);
    }

    imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage *res = [UIImage imageWithCGImage:imageRef scale:imageScale orientation:UIImageOrientationUp];

    /**
     一定要,千万要release,否则等着内存泄露吧,稍微高清点的图一张图就是几M内存,很快App就挂了
     */
    CGImageRelease(imageRef);

    return res;
}

@end

 

以上是关于第七篇OC_图片的裁剪基于SDWebImage的主要内容,如果未能解决你的问题,请参考以下文章

第六十七篇OC_UITableView head下拉图片放大的效果

python基础-第七篇-7.3反射

第七篇Python之模块/包

DirectX11第七篇 光照模型——环境光

DirectX11第七篇 光照模型——环境光

(转)SpringBoot非官方教程 | 第七篇:springboot开启声明式事务