RATakePhotoPreviewController.m 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. //
  2. // TakePhotoPreviewController.m
  3. // RA Image
  4. //
  5. // Created by Jack on 2017/5/15.
  6. // Copyright © 2017年 USAI. All rights reserved.
  7. //
  8. #import "RATakePhotoPreviewController.h"
  9. #import "const.h"
  10. #import "UIImage+fixOrientation.h"
  11. @interface RATakePhotoPreviewController ()<UIScrollViewDelegate>
  12. @property (strong, nonatomic) IBOutlet UIScrollView *previewScroll;
  13. @property (strong, nonatomic) IBOutlet UIView *editContainer;
  14. @property (strong, nonatomic) IBOutlet UIButton *retakeBtn;
  15. @property (strong, nonatomic) IBOutlet UIButton *usePhotoBtn;
  16. @property (strong, nonatomic) IBOutlet UIView *toolBarView;
  17. @property (nonatomic,strong) UIImageView *imgView;
  18. @end
  19. @implementation RATakePhotoPreviewController
  20. + (instancetype)viewControllerFromStoryboard {
  21. RATakePhotoPreviewController *previewVC = [[UIStoryboard storyboardWithName:@"Camera" bundle:nil] instantiateViewControllerWithIdentifier:[self storyboardID]];
  22. return previewVC;
  23. }
  24. - (void)viewDidLoad {
  25. [super viewDidLoad];
  26. // Do any additional setup after loading the view.
  27. [self.view insertSubview:[UIView new] atIndex:0];
  28. self.editContainer.layer.borderColor = [UIColor lightGrayColor].CGColor;
  29. self.editContainer.layer.borderWidth = 0.5f;
  30. self.editContainer.userInteractionEnabled = NO;
  31. // UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewPinch:)];
  32. // [self.editContainer addGestureRecognizer:pinch];
  33. [self.previewScroll addSubview:self.imgView];
  34. }
  35. - (void)setPreImage:(UIImage *)preImage {
  36. _preImage = [preImage fixOrientation];
  37. // self.nameLabel.text = name;
  38. }
  39. - (void)viewDidLayoutSubviews {
  40. [super viewDidLayoutSubviews];
  41. CGSize size = [self imgViewOriginSize];
  42. CGRect frame = CGRectMake(0, 70, size.width, size.height); // 水平居中
  43. if (frame.size.height < CGRectGetHeight(self.editContainer.frame)) { // 横屏拍照时,照片在编辑框垂直居中
  44. frame.origin.y = CGRectGetMinY(self.editContainer.frame) + (CGRectGetHeight(self.editContainer.frame) - CGRectGetHeight(frame)) * 0.5;
  45. }
  46. self.imgView.frame = frame;
  47. }
  48. - (BOOL)prefersStatusBarHidden {
  49. return YES;
  50. }
  51. - (void)didReceiveMemoryWarning {
  52. [super didReceiveMemoryWarning];
  53. // Dispose of any resources that can be recreated.
  54. }
  55. - (CGSize)imgViewOriginSize {
  56. CGFloat width = CGRectGetWidth(self.previewScroll.bounds);
  57. CGFloat height = CGRectGetHeight(self.previewScroll.bounds);
  58. CGFloat w = self.preImage.size.width;
  59. CGFloat h = self.preImage.size.height;
  60. // 根据图片大小和ScrollView大小等比缩放,使ScrollView容得下图片
  61. float factor = MAX(w / width, h / height);
  62. factor = 1 / factor;
  63. CGSize size = CGSizeMake(w * factor, h * factor);
  64. return size;
  65. }
  66. - (UIImageView *)imgView {
  67. if (!_imgView) {
  68. _imgView = [[UIImageView alloc] initWithImage:self.preImage];
  69. _imgView.userInteractionEnabled = YES;
  70. }
  71. return _imgView;
  72. }
  73. - (UIImage *)captureImageInView:(UIView *)view {
  74. UIImage *img = nil;
  75. // UIGraphicsBeginImageContext(view.frame.size);
  76. UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
  77. if ([view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
  78. [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
  79. } else {
  80. [view.layer renderInContext:UIGraphicsGetCurrentContext()];
  81. }
  82. img = UIGraphicsGetImageFromCurrentImageContext();
  83. UIGraphicsEndImageContext();
  84. return img;
  85. }
  86. - (UIImage *)captureImageWithImage:(UIImage *)image inRect:(CGRect)rect {
  87. CGFloat scale = image.scale;
  88. rect.origin.x *= scale;
  89. rect.origin.y *= scale;
  90. rect.size.height *= scale;
  91. rect.size.width *= scale;
  92. CGImageRef imgRef = CGImageCreateWithImageInRect(image.CGImage, rect);
  93. UIImage *img = [UIImage imageWithCGImage:imgRef scale:0 orientation:image.imageOrientation];
  94. CGImageRelease(imgRef);
  95. return img;
  96. }
  97. - (IBAction)retakeBtnClick:(UIButton *)sender {
  98. if (self.photoHandler) {
  99. self.photoHandler(nil);
  100. }
  101. [self.navigationController popViewControllerAnimated:YES];
  102. }
  103. - (IBAction)usePhotoClick:(UIButton *)sender {
  104. if (self.photoHandler) {
  105. CGRect imgRect = self.imgView.frame;
  106. CGRect editRect = self.editContainer.frame;
  107. CGPoint contentOffset = self.previewScroll.contentOffset;
  108. CGRect clipRect = CGRectMake(editRect.origin.x + 1 + contentOffset.x, editRect.origin.y + 1 + contentOffset.y - imgRect.origin.y, editRect.size.width - 2, editRect.size.height -2);
  109. CGFloat xp = clipRect.origin.x / imgRect.size.width;
  110. CGFloat yp = clipRect.origin.y / imgRect.size.height;
  111. CGFloat wp = clipRect.size.width / imgRect.size.width;
  112. CGFloat hp = clipRect.size.height / imgRect.size.height;
  113. CGSize size = self.preImage.size;
  114. CGRect clipImgRect = CGRectMake(size.width * xp, size.height * yp, size.width * wp, size.height * hp);
  115. UIImage *img = [self captureImageWithImage:self.preImage inRect:clipImgRect];
  116. self.photoHandler(img);
  117. }
  118. if (self.popTo) {
  119. [self.navigationController popToViewController:self.popTo animated:YES];
  120. } else {
  121. [self.navigationController popViewControllerAnimated:YES];
  122. }
  123. }
  124. //-(void) testimg
  125. //{
  126. // UIImageOrientation o =self.preImage.imageOrientation;
  127. //
  128. // CGRect imgviewRect = self.imgView.frame;
  129. // CGRect editRect = self.editContainer.frame;
  130. // CGPoint offset= self.previewScroll.contentOffset;
  131. //
  132. // double sscale=self.previewScroll.zoomScale;
  133. // CGSize contentsize=self.previewScroll.contentSize;
  134. //
  135. // CGRect imgScreenRect = CGRectMake(imgviewRect.origin.x-offset.x, imgviewRect.origin.y-offset.y, imgviewRect.size.width, imgviewRect.size.height);
  136. //
  137. // double scale = imgScreenRect.size.width/self.preImage.size.width;//1;//self.previewScroll.zoomScale*(imgviewRect.size.width/self.preImage.size.width);
  138. // CGRect rectimg = CGRectMake((editRect.origin.x-imgScreenRect.origin.x)/scale, (editRect.origin.y-imgScreenRect.origin.y)/scale, editRect.size.width/scale, editRect.size.height/scale);
  139. //// UIImage * newimg=[UIImage imageWithCGImage:self.preImage.CGImage scale:1 orientation:UIImageOrientationUp];
  140. // UIImage * img= [self captureImageWithImage:self.preImage inRect:rectimg];//
  141. // UIImage* img1 =[self getSubImage:rectimg img:self.preImage];
  142. // return;
  143. //}
  144. //
  145. //
  146. //-(UIImage*)getSubImage:(CGRect)rect img:(UIImage*)img
  147. //{
  148. //
  149. // //将UIImage转换成CGImageRef
  150. // CGImageRef sourceImageRef = [img CGImage];
  151. //
  152. // //按照给定的矩形区域进行剪裁
  153. // CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
  154. //
  155. // //将CGImageRef转换成UIImage
  156. // UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
  157. //
  158. // //返回剪裁后的图片
  159. // return newImage;
  160. //
  161. //
  162. // CGImageRef subImageRef = CGImageCreateWithImageInRect(img.CGImage, rect);
  163. // UIImage* debugimg = [UIImage imageWithCGImage:subImageRef];
  164. // CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));
  165. //
  166. // UIGraphicsBeginImageContext(smallBounds.size);
  167. // CGContextRef context = UIGraphicsGetCurrentContext();
  168. // CGContextDrawImage(context, smallBounds, subImageRef);
  169. // UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];
  170. // UIGraphicsEndImageContext();
  171. //
  172. // return smallImage;
  173. //}
  174. #pragma mark - UIScrollViewDelegate
  175. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  176. return self.imgView;
  177. }
  178. - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
  179. CGRect imgRect = self.imgView.frame;
  180. CGSize contentSize = scrollView.contentSize;
  181. contentSize.height += imgRect.origin.y;
  182. scrollView.contentSize = contentSize;
  183. }
  184. //#pragma mark - pinch
  185. //
  186. //- (void)imageViewPinch:(UIPinchGestureRecognizer *)pinch{
  187. //
  188. // UIScrollView *scroll = self.previewScroll;
  189. // UIImageView *imgv = [scroll.subviews firstObject];
  190. //
  191. // CGFloat width = scroll.frame.size.width;
  192. // CGFloat height = scroll.frame.size.height;
  193. //
  194. // imgv.transform = CGAffineTransformScale(imgv.transform, pinch.scale, pinch.scale);
  195. // CGSize size = scroll.contentSize;
  196. // // size.width = size.width * pinch.scale;
  197. // // size.height = size.height * pinch.scale;
  198. // size = imgv.frame.size;// bounds 和 frame 不一致
  199. // CGSize itemSize = self.editContainer.frame.size;
  200. // DebugLog(@"size %@",[NSValue valueWithCGSize:size]);
  201. // if (size.height < itemSize.height || size.width < itemSize.width) { // 禁止缩小得比原图小
  202. // imgv.transform = CGAffineTransformIdentity;
  203. // size = imgv.frame.size;
  204. // }
  205. //
  206. //
  207. //// if (size.width < width) {
  208. //// size.width = width;
  209. //// }
  210. //// if (size.height < height) {
  211. //// size.height = height;
  212. //// }
  213. //
  214. // scroll.contentSize = size;
  215. // scroll.contentOffset = CGPointMake((size.width - width) * 0.5, (size.height - height) * 0.5);
  216. // // 保持在屏幕中心
  217. // CGPoint offset = scroll.contentOffset;
  218. // CGFloat x = offset.x + width * 0.5;
  219. // CGFloat y = offset.y + height * 0.5;
  220. // imgv.center = CGPointMake(x, y);
  221. //
  222. // pinch.scale = 1;
  223. //}
  224. @end