图片处理---缩放,挖取,截屏,旋转

相关代码git地址
- 1 给UIImage建一个Category,KHandle
.h文件定义方法


#import <UIKit/UIKit.h>

@interface UIImage (KHandle)
/**
* 对指定的UI控件进行截图
*/
+ (UIImage *)captureView:(UIView *)targetView;
/**
 * 截屏
 */
+ (UIImage *)captureScreen;
/**
 * 挖取图片的指定区域
 */
- (UIImage *)imageAtRect:(CGRect)rect;
/**
 *保持图片纵横比缩放,最短边缩放后必须匹配targetSize的大小,长边截取
 */
- (UIImage *)imageByScalingAspectToMinSize:(CGSize)targetSize;
/**
 *保持图片纵横比缩放,最短长边缩放后必须匹配targetSize的大小,短边留白
 */
- (UIImage *)imageByScalingAspectToMaxSize:(CGSize)targetSize;
/**
 * 不保持图片的纵横比缩放
 */
- (UIImage *)imageByScalingToSize:(CGSize)targetSize;
/**
 * 对图片按弧度执行旋转
 */
- (UIImage *)imageRotatedByRadians:(CGFloat)radians;
/**
 * 对图片按角度执行旋转
 */
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
/**
 *保存图片
 */
- (void)saveToDocuments:(NSString *)fileName;

@end
  • 2 .m文件实现
#import "UIImage+KHandle.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIImage (KHandle)
+ (UIImage *)captureView:(UIView *)targetView {

    //获取目标UIView所在的区域
    CGRect rect = targetView.frame;
    //开始绘图
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //调用CALayer的方法将当前控件绘制到绘图ctx中
    [targetView.layer renderInContext:ctx];
    //获取该绘图ctx中的图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();\
    UIGraphicsEndImageContext();
    return newImage;

}
+ (UIImage *)captureScreen {

    UIWindow*screenWindow = [[UIApplication sharedApplication]keyWindow];
    return [self captureView:screenWindow];
}
- (UIImage *)imageAtRect:(CGRect)rect {

    //获取UIImage图片对应的CGImageRef对象
    CGImageRef srcImage = [self CGImage];
    //从srcImage中挖取rect区域
    CGImageRef imageRef = CGImageCreateWithImageInRect(srcImage, rect);
    //将挖取到的CGImageRef转化为UIImage对象
    UIImage *subImage = [UIImage imageWithCGImage:imageRef];
    return subImage;

}
- (UIImage *)imageByScalingAspectToMinSize:(CGSize)targetSize {

    //获取源图片的宽和高
    CGSize imageSize = self.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    //获取图片缩放目标大小的宽和高
    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;
    //定义图片缩放后的宽度
    CGFloat scaledWidth = targetWidth;
    //定义图片缩放后的高度
    CGFloat scaledHeight = targetHeight;
    CGPoint anchorPoint = CGPointZero;
    //如果源图片的大小于缩放的目标大小不相等
    if (!CGSizeEqualToSize(imageSize, targetSize)) {

        //计算水平方向上的缩放因子
        CGFloat xFactor = targetHeight/width;
        //计算垂直方向上的缩放因子
        CGFloat yFactor = targetHeight/height;
        //定义缩放因子scaleFactor为两个缩放因子中较大的一个
        CGFloat scaleFactor = xFactor>yFactor?xFactor:yFactor;
        //根据缩放因子计算图片缩放后的高度和宽度
        scaledWidth = width* scaleFactor;
        scaledHeight = height *scaleFactor;
        //如果横向上的缩放因子大于纵向上的缩放因子,那么图片在纵向上需要裁剪
        if (xFactor>yFactor) {
            anchorPoint.y = (targetHeight - scaledHeight)/2.0;
        }else if (xFactor < yFactor) {

            anchorPoint.x = (targetWidth - scaledWidth)/2.0;


        }

    }
    //开始绘图
    UIGraphicsBeginImageContext(targetSize);
    //定义图片缩放后的区域
    CGRect anchorRect = CGRectZero;
    anchorRect.origin = anchorPoint;
    anchorRect.size.width = scaledWidth;
    anchorRect.size.height = scaledHeight;
    //将图片本身绘制到anchorRect区域中
    [self drawInRect:anchorRect];

    //获取绘制后生成的新图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
- (UIImage *)imageByScalingAspectToMaxSize:(CGSize)targetSize {

    //获取源图片的宽和高
    CGSize imageSize = self.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    //获取图片缩放目标大小的宽和高
    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;
    //定义图片缩放后的宽度
    CGFloat scaledWidth = targetWidth;
    //定义图片缩放后的高度
    CGFloat scaledHeight = targetHeight;
    CGPoint anchorPoint = CGPointZero;
    //如果源图片的大小于缩放的目标大小不相等
    if (!CGSizeEqualToSize(imageSize, targetSize)) {

        //计算水平方向上的缩放因子
        CGFloat xFactor = targetHeight/width;
        //计算垂直方向上的缩放因子
        CGFloat yFactor = targetHeight/height;
        //定义缩放因子scaleFactor为两个缩放因子中较小的一个
        CGFloat scaleFactor = xFactor<yFactor?xFactor:yFactor;
        //根据缩放因子计算图片缩放后的高度和宽度
        scaledWidth = width* scaleFactor;
        scaledHeight = height *scaleFactor;
        //如果横向上的缩放因子小于纵向上的缩放因子,那么图片上下留空白
        if (xFactor<yFactor) {
            anchorPoint.y = (targetHeight - scaledHeight)/2.0;
        }else if (xFactor > yFactor) {

            anchorPoint.x = (targetWidth - scaledWidth)/2.0;


        }

    }
    //开始绘图
    UIGraphicsBeginImageContext(targetSize);
    //定义图片缩放后的区域
    CGRect anchorRect = CGRectZero;
    anchorRect.origin = anchorPoint;
    anchorRect.size.width = scaledWidth;
    anchorRect.size.height = scaledHeight;
    //将图片本身绘制到anchorRect区域中
    [self drawInRect:anchorRect];

    //获取绘制后生成的新图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
//不保持图片缩放比
- (UIImage *)imageByScalingToSize:(CGSize)targetSize {

    //开始绘图
    UIGraphicsBeginImageContext(targetSize);
    //定义图片缩放后的区域,无需保持纵横比,所以直接缩放
    CGRect anchorRect = CGRectZero;
    anchorRect.origin = CGPointZero;
    anchorRect.size = targetSize;
    [self drawInRect:anchorRect];
    //获取绘制后生成的新图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
//图片旋转角度
- (UIImage *)imageRotatedByRadians:(CGFloat)radians {

    //定义一个执行旋转的CGAffineTransform结构体
    CGAffineTransform t = CGAffineTransformMakeRotation(radians);
    //对图片的原始区域执行旋转,获取旋转后的区域
    CGRect rotateRect = CGRectApplyAffineTransform(CGRectMake(0, 0, self.size.width, self.size.height), t);
    //获取图片旋转后的大小
    CGSize rotatedSize = rotateRect.size;
    //创建绘制位图的上下文
    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //指定坐标变换,将坐标中心平移到图片中心
    CGContextTranslateCTM(ctx, rotatedSize.width/2.0, rotatedSize.height/2.0);
    //执行坐标变换,旋转过radians弧度
    CGContextRotateCTM(ctx, radians);
    //执行坐标变换,执行缩放
    CGContextScaleCTM(ctx, 1.0, -1.0);
    //绘制图片
    CGContextDrawImage(ctx, CGRectMake(-self.size.width/2.0, -self.size.height/2.0, self.size.width, self.size.height), self.CGImage);
    //获取绘制后生成的新图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees {

    return [self imageRotatedByRadians:degrees*M_PI/180.0];
}
- (void)saveToDocuments:(NSString *)fileName {

    //获取当前应用路径中Documents目录下的指定文件名对应的文件路径

    NSString*path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:fileName];
    //保存PNG图片
    [UIImagePNGRepresentation(self) writeToFile:path atomically:YES];

}
@end
  • 3 视图控制器调用
#import "ViewController.h"
#import "UIImage+KHandle.h"
@interface ViewController () {

    UIImage *rawImage;


}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor grayColor];
    //获取原始的UIImage对象
    rawImage = [UIImage imageNamed:@"CYP_ComplaintsSuccess.png"];
    NSLog(@"%@",NSStringFromCGSize(rawImage.size));

    //原图
    UIImageView *imageView = [[UIImageView alloc] initWithImage:rawImage];
    imageView.frame = CGRectMake(0, 0, rawImage.size.width, rawImage.size.height);
    imageView.center = CGPointMake(100, 300);
    imageView.backgroundColor = [UIColor redColor];
    [self.view addSubview:imageView];

    UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(10, 30, 62, 52)];
     imageView1.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:imageView1];
    [imageView1 setImage:[rawImage imageRotatedByDegrees:30]];


    UIImageView *imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(100, 30, 100, 100)];
    imageView2.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:imageView2];
    [imageView2  setImage:[rawImage imageByScalingToSize:imageView2.frame.size]];



    UIImageView *imageView3 = [[UIImageView alloc] initWithFrame:CGRectMake(220, 30, 100, 100)];
    imageView3.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:imageView3];
    [imageView3  setImage:[rawImage imageByScalingAspectToMaxSize:imageView3.frame.size]];



    UIImageView *imageView4 = [[UIImageView alloc] initWithFrame:CGRectMake(20, 200, 20, 20)];
    imageView4.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:imageView4];
    [imageView4  setImage:[rawImage imageAtRect:CGRectMake(20, 20, 20, 20)]];



    UIImageView *imageView5 = [[UIImageView alloc] initWithFrame:CGRectMake(220, 170, 100, 100)];
    imageView5.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:imageView5];
    [imageView5  setImage:[rawImage imageByScalingAspectToMinSize:imageView5.frame.size]];

}

运行效果图如下
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值