Подивіться на https://github.com/vvbogdan/BVCropPhoto
- (UIImage *) croppedImage {
CGFloat шкала = self.sourceImage.size.width / self.scrollView.contentSize.width;
UIImage * finalImage = нуль;
CGRect targetFrame = CGRectMake ((self.scrollView.contentInset.left + self.scrollView.contentOffset.x) * масштаб,
(self.scrollView.contentInset.top + self.scrollView.contentOffset.y) * шкала,
self.cropSize.width * шкала,
self.cropSize.height * шкала);
CGImageRef contextImage = CGImageCreateWithImageInRect ([[self imageWithRotation: self.sourceImage] CGImage], targetFrame);
якщо (contextImage! = NULL) {
finalImage = [UIImage imageWithCGImage: contextImage
масштаб: self.sourceImage.scale
орієнтація: UIImageOrientationUp];
CGImageRelease (contextImage);
}
повернути фіналImage;
}
- (UIImage *) imageWithRotation: (UIImage *) image {
якщо (image.imageOrientation == UIImageOrientationUp) повернути зображення;
CGAffineTransform перетворення = CGAffineTransformIdentity;
перемикач (image.imageOrientation) {
випадок UIImageOrientationDown:
випадок UIImageOrientationDownMirrored:
перетворення = CGAffineTransformTranslate (перетворення, зображення.розмір.ширина, зображення.розмір) висота);
перетворення = CGAffineTransformRotate (перетворення, M_PI);
перерва;
випадок UIImageOrientationLeft:
випадок UIImageOrientationLeftMirrored:
перетворення = CGAffineTransformTranslate (перетворення, зображення. розмір.ширина, 0);
перетворення = CGAffineTransformRotate (перетворення, M_PI_2);
перерва;
випадок UIImageOrientationRight:
випадок UIImageOrientationRightMirrored:
перетворення = CGAffineTransformTranslate (перетворення, 0, image.size.height);
перетворення = CGAffineTransformRotate (перетворення, -M_PI_2);
перерва;
випадок UIImageOrientationUp:
випадок UIImageOrientationUpMirrored:
перерва;
}
перемикач (image.imageOrientation) {
випадок UIImageOrientationUpMirrored:
випадок UIImageOrientationDownMirrored:
перетворення = CGAffineTransformTranslate (перетворення, зображення. розмір.ширина, 0);
перетворення = CGAffineTransformScale (перетворення, -1, 1);
перерва;
випадок UIImageOrientationLeftMirrored:
випадок UIImageOrientationRightMirrored:
перетворення = CGAffineTransformTranslate (перетворення, image.size.height, 0);
перетворення = CGAffineTransformScale (перетворення, -1, 1);
перерва;
випадок UIImageOrientationUp:
випадок UIImageOrientationDown:
випадок UIImageOrientationLeft:
випадок UIImageOrientationRight:
перерва;
}
// Тепер ми малюємо основний CGImage в новому контексті, застосовуючи перетворення
// обчислено вище.
CGContextRef ctx = CGBitmapContextCreate (NULL, image.size.width, image.size.height,
CGImageGetBitsPerComponent (image.CGImage), 0,
CGImageGetColorSpace (image.CGImage),
CGImageGetBitmapInfo (image.CGImage));
CGContextConcatCTM (ctx, перетворення);
перемикач (image.imageOrientation) {
випадок UIImageOrientationLeft:
випадок UIImageOrientationLeftMirrored:
випадок UIImageOrientationRight:
випадок UIImageOrientationRightMirrored:
// Гр ...
CGContextDrawImage (ctx, CGRectMake (0, 0, image.size.height, image.size.width), image.CGImage);
перерва;
за замовчуванням:
CGContextDrawImage (ctx, CGRectMake (0, 0, image.size.width, image.size.height), image.CGImage);
перерва;
}
// А тепер ми просто створюємо новий UIImage з контексту малювання
CGImageRef cgimg = CGBitmapContextCreateImage (ctx);
UIImage * img = [UIImage imageWithCGImage: cgimg];
CGContextRelease (ctx);
CGImageRelease (cgimg);
return img;
}