zoukankan      html  css  js  c++  java
  • 第七篇、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(@"
    imageWith === %f
    imageHeight === %f
    ImageView宽高比 == %f
    imageScale == %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
  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/6033010.html
Copyright © 2011-2022 走看看