• 图片的旋转、缩放操作的分类


    UIImage+fixOrientation.h

    #import <UIKit/UIKit.h>
    
    @interface UIImage (fixOrientation)
    
    /**
     将当前的图片旋转一下
     */
    - (UIImage *)fixOrientation;
    
    /**
     按当前屏幕的分辨率的倍数缩放图片大小
     */
    - (UIImage *)imageCompress;
    
    /**
     根据ImageView的Size进行缩放
     */
    - (UIImage *)imageCompressWithImageViewSize:(CGSize)vSize;
    
    /**
     根据ImageView的Size进行裁剪图片
     */
    - (UIImage *)imageCompressWithImageViewNoAutoChangeWithSize:(CGSize)vSize;
    
    @end

    UIImage+fixOrientation.m

    #import "UIImage+fixOrientation.h"
    
    @implementation UIImage (fixOrientation)
    
    - (UIImage *)fixOrientation{
        // No-op if the orientation is already correct
        if (self.imageOrientation == UIImageOrientationUp) return self;
        
        // We need to calculate the proper transformation to make the image upright.
        // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
        CGAffineTransform transform = CGAffineTransformIdentity;
        
        switch (self.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
                
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
                
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, 0, self.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationUpMirrored:
                break;
        }
        
        switch (self.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.width, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
                
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, self.size.height, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationDown:
            case UIImageOrientationLeft:
            case UIImageOrientationRight:
                break;
        }
        
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                                 CGImageGetBitsPerComponent(self.CGImage), 0,
                                                 CGImageGetColorSpace(self.CGImage),
                                                 CGImageGetBitmapInfo(self.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (self.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
                break;
                
            default:
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
                break;
        }
        
        // And now we just create a new UIImage from the drawing context
        CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
        UIImage *img = [UIImage imageWithCGImage:cgimg];
        CGContextRelease(ctx);
        CGImageRelease(cgimg);
        return img;
    }
    
    - (UIImage *)imageCompress{
        
    //    CGSize size = self.size;
    //    CGFloat width = size.width;
    //    CGFloat height = size.height;
        
    //    NSInteger retinalMutipler = [UIScreen mainScreen].scale;
    //    CGFloat scale = kAllWidth*1.0*retinalMutipler/width;
        
    //    CGFloat scaleWidth = width*scale;
    //    CGFloat scaleHeight = height*scale;
    //    UIGraphicsBeginImageContext(size);//this will crop
    //    [self drawInRect:CGRectMake(0, 0, scaleWidth, scaleHeight)];
    //    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    //    UIGraphicsEndImageContext();
        
        
        UIImage *newImage = nil;
        
        @autoreleasepool {
            NSInteger retinalMutipler = [UIScreen mainScreen].scale;
            CGSize targetSize = CGSizeMake(0, 0);
            
            //判断长宽
            if (self.size.height>=self.size.width) {
                //高度长宽度短的图片
                //计算宽度占高度的比例
                CGFloat widthHeightRate = self.size.width*1.0/self.size.height;
                CGFloat scaleHeight = kAllHeight*1.0*retinalMutipler;
                CGFloat scaleWidth = scaleHeight*widthHeightRate;
                targetSize = CGSizeMake(scaleWidth, scaleHeight);
            }else{
                //宽度长高度短的图片
                //计算高度占宽度的比例
                CGFloat heightWidthRate = self.size.height*1.0/self.size.width;
                CGFloat scaleWidth = kAllWidth*1.0*retinalMutipler;
                CGFloat scaleHeight = scaleWidth*heightWidthRate;
                targetSize = CGSizeMake(scaleWidth, scaleHeight);
            }
            
            //CGSize targetSize = CGSizeMake(retinalMutipler*kAllWidth, retinalMutipler*kAllHeight);
            UIGraphicsBeginImageContext(targetSize);
            [self drawInRect:CGRectMake(0, 0, targetSize.width, targetSize.height)];
            newImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }
        
        return newImage;
        
    }
    
    - (UIImage *)imageCompressWithImageViewSize:(CGSize)vSize{
        
        if (CGSizeEqualToSize(vSize, CGSizeZero)) {
            return [self imageCompress];
        }
        
        UIImage *newImage = nil;
        
        @autoreleasepool {
            //源文件大小
            CGSize sourceSize = self.size;
            
            //屏幕的缩放比例
            NSInteger retinalMutipler = [UIScreen mainScreen].scale;
            //设置画板的Size
            vSize = CGSizeMake(retinalMutipler*vSize.width, retinalMutipler*vSize.height);
            
            //获取宽度和高度的缩放比例
            CGFloat widthRate = vSize.width*1.0/sourceSize.width;
            CGFloat heightRate = vSize.height*1.0/sourceSize.height;
            
            //判断哪个比例最小,就用哪个比例进行缩放
            CGSize targetSize = CGSizeZero;
            if (widthRate <= heightRate) {
                targetSize.width = sourceSize.width * widthRate;
                targetSize.height = sourceSize.height * widthRate;
            }else{
                targetSize.width = sourceSize.width * heightRate;
                targetSize.height = sourceSize.height * heightRate;
            }
            
            //获取绘制图片的X和Y
            CGFloat targetX = floorf((vSize.width - targetSize.width)/2.0);
            CGFloat targetY = floorf((vSize.height - targetSize.height)/2.0);
            
            UIGraphicsBeginImageContext(vSize);
            [self drawInRect:CGRectMake(targetX, targetY, targetSize.width, targetSize.height)];
            newImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }
        
        return newImage;
    }
    
    - (UIImage *)imageCompressWithImageViewNoAutoChangeWithSize:(CGSize)vSize{
        if (CGSizeEqualToSize(vSize, CGSizeZero)) {
            return [self imageCompress];
        }
        
        UIImage *newImage = nil;
        
        @autoreleasepool {
            //源文件大小
            CGSize sourceSize = self.size;
            
            //屏幕的缩放比例
            NSInteger retinalMutipler = [UIScreen mainScreen].scale;
            //设置画板的Size
            vSize = CGSizeMake(retinalMutipler*vSize.width, retinalMutipler*vSize.height);
            
            //获取宽度和高度的缩放比例
            CGFloat widthRate = vSize.width*1.0/sourceSize.width;
            CGFloat heightRate = vSize.height*1.0/sourceSize.height;
            
            //判断哪个比例较大,就用哪个比例进行缩放
            CGSize targetSize = CGSizeZero;
            if (widthRate >= heightRate) {
                targetSize.width = sourceSize.width * widthRate;
                targetSize.height = sourceSize.height * widthRate;
            }else{
                targetSize.width = sourceSize.width * heightRate;
                targetSize.height = sourceSize.height * heightRate;
            }
            
            //获取绘制图片的X和Y
            CGFloat targetX = floorf((vSize.width - targetSize.width)/2.0);
            CGFloat targetY = floorf((vSize.height - targetSize.height)/2.0);
            
            UIGraphicsBeginImageContext(vSize);
            [self drawInRect:CGRectMake(targetX, targetY, targetSize.width, targetSize.height)];
            newImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }
        
        return newImage;
    }
    
    @end
  • 相关阅读:
    asyncio异步IO--协程(Coroutine)与任务(Task)详解
    python爬虫实战:利用scrapy,短短50行代码下载整站短视频
    深入理解Git的实现原理
    Upsource 代码审查工具安装及使用
    MAC MAMP集成环境安装 PHP 扩展
    千万数据量数据表分表实践
    设计模式:序言
    设计模式 行为型
    PHP5底层原理之变量
    PHP5底层原理之垃圾回收机制
  • 原文地址:https://www.cnblogs.com/wobuyayi/p/8523909.html
Copyright © 2020-2023  润新知