第七篇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的主要内容,如果未能解决你的问题,请参考以下文章