【iOS】截屏、保存图片到相册

为了简便我们的开发,通常会建立一个分类来处理,废话不多说,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import <UIKit/UIKit.h>

typedef enum : NSUInteger {
ImageRotationAngleZero = 0,//逆时针旋转0°
ImageRotationAngleM_PI_2 = 90,//逆时针旋转90°
ImageRotationAngleM_PI = 180,//逆时针旋转180°
ImageRotationAngle3M_PI_2 = 270//逆时针旋转270°
} ImageRotationAngle;

@interface UIImage (SnipImage)

/**
缩放并保存图片到相册

@param imagePath 图片地址
*/
+ (void)scaleAndSaveImage:(NSString *)imagePath;

/**
截屏并保存
*/
+ (void)snipAndSaveImage;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#import "UIImage+SnipImage.h"

@implementation UIImage (SnipImage)

//截屏并裁剪保存图片
+ (void)snipAndSaveImage{
CGSize imageSize = [[UIScreen mainScreen] bounds].size;

UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);

CGContextRef context = UIGraphicsGetCurrentContext();

for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {
CGContextSaveGState(context);

CGContextTranslateCTM(context, [window center].x, [window center].y);

CGContextConcatCTM(context, [window transform]);

CGContextTranslateCTM(context,
-[window bounds].size.width * [[window layer] anchorPoint].x,
-[window bounds].size.height * [[window layer] anchorPoint].y);

[[window layer] renderInContext:context];

CGContextRestoreGState(context);
}
}

UIImage *snipImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImage *saveImage = [self scaleImage:snipImage];
UIImageWriteToSavedPhotosAlbum(saveImage,self, nil, nil);
}

//根据图片地址裁剪并保存图片
+ (void)scaleAndSaveImage:(NSString *)imagePath{
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

UIImage *saveImage = [self scaleImage:image];

UIImageWriteToSavedPhotosAlbum(saveImage,self, nil, nil);
}

//裁剪图片(此处容易有坑 *所有的尺寸应该是分辨率)
+ (UIImage *)scaleImage:(UIImage *)image{
CGFloat screenPX_width = [UIScreen mainScreen].bounds.size.width*2;
CGFloat screenPX_height = [UIScreen mainScreen].bounds.size.height*2;

//裁剪区域根据需求自己处理
CGFloat scaleImage_offset = 10;
CGFloat scaleImage_height = screenPX_height-30*2;
CGFloat scaleImage_width = screenPX_width * 0.635;
CGFloat scaleImage_x = (screenPX_width - scaleImage_width)/2+scaleImage_offset;
CGFloat scaleImage_y = 30;

UIImage *scaleImage = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(image.CGImage, CGRectMake(scaleImage_x, scaleImage_y, scaleImage_width, scaleImage_height))];
UIImage *saveImage = [self rotationImage:scaleImage angle:270];
return saveImage;
}

//旋转图片到指定角度
+ (UIImage *)rotationImage:(UIImage *)image angle:(ImageRotationAngle)angle{
long double rotate = 0.0;
CGRect rect;
float translateX = 0;
float translateY = 0;
float scaleX = 1.0;
float scaleY = 1.0;

switch (angle) {
case ImageRotationAngleZero:
return image;
break;

case ImageRotationAngleM_PI_2:
rotate = M_PI_2;
rect = CGRectMake(0, 0, image.size.height, image.size.width);
translateX = 0;
translateY = -rect.size.width;
scaleY = rect.size.width/rect.size.height;
scaleX = rect.size.height/rect.size.width;
break;

case ImageRotationAngleM_PI:
rotate = M_PI;
rect = CGRectMake(0, 0, image.size.width, image.size.height);
translateX = -rect.size.width;
translateY = -rect.size.height;
break;

case ImageRotationAngle3M_PI_2:
rotate = 3 * M_PI_2;
rect = CGRectMake(0, 0, image.size.height, image.size.width);
translateX = -rect.size.height;
translateY = 0;
scaleY = rect.size.width/rect.size.height;
scaleX = rect.size.height/rect.size.width;
break;

default:
break;
}

UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextRotateCTM(context, rotate);
CGContextTranslateCTM(context, translateX, translateY);

CGContextScaleCTM(context, scaleX, scaleY);
CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
return newImage;
}

@end