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
  • 相关阅读:
    关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析
    EventBus完全解析--组件/线程间通信利器
    【凯子哥带你学Framework】Activity启动过程全解析
    【凯子哥带你学Framework】Activity界面显示全解析
    APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
    全面理解Context
    Activity的四种launchMode
    Android动态加载框架汇总
    Android中Shape的使用
    Ninject简单的Demo
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/6033010.html
Copyright © 2011-2022 走看看