Обрезать изображение с помощью CGRect
Я пытаюсь сделать это с незапамятных времен. У меня есть наложение камеры. Я хочу, чтобы мое окончательное изображение было частью изображения, видимого со встроенной камеры. Я сделал CGRect с размерами, равными квадрату в камере. Затем я попытался обрезать его с помощью этой функции.
- (UIImage *)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
{
CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return croppedImage;
}
Я назвал это так
CGRect rect = CGRectMake(10, 72, 300, 300);
UIImage *realImage = [self imageByCropping:[self.capturedImages objectAtIndex:0] toRect:rect];
Я получаю изображение плохого качества с неправильной ориентацией.
::РЕДАКТИРОВАТЬ::
С ответом Нитина я могу обрезать правильную часть экрана, но проблема в том, что он обрезает вид, следующий за видом с камеры, "вид подтверждения". Я подозреваю, что это потому, что код Нитина использует
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
и потому что ViewController, в котором все это происходит, потому что View Controller для Confirmation View является контроллером, в котором выполняется этот код. Я попытаюсь объяснить это небольшой картой
CameraOverlay.xib(он использует этот xib для создания наложения) <===== CameraOverlayViewController ---------> ConfirmationView
Поэтому, когда сначала вызывается ViewController (кнопка на панели вкладок), он открывает камеру (UIImagePickerController) с наложением поверх нее. Затем, когда пользователь щелкает изображение, оно отображается в ConfirmationView.
То, что я думаю, происходит, когда UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, 1.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
эти строки выполняются, View в это время - ConfirmationView.
Примечание: я вызываю функцию в
(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
метод.
1 ответ
См. Руководство по рисованию и печати.
Система координат по умолчанию отличается между CoreGraphics и UIKit. Я думаю, что ваша проблема из-за этого факта.
Их использование может помочь вам решить проблему
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context , 0.0, rect.size.height);
CGContextScaleCTM(context , 1.0, -1.0);