Подтвердить что ты не робот

Изображение UIImageView на основе маски UIView

Итак, у меня есть холст (UIView) и UIImageView, холст действует как маска над imageview

enter image description here

Я использую UIGestureRecognizers для масштабирования и поворота UIImageView, который находится под холстом.

Я хочу преобразовать конечное изображение (показать в холсте в UIImage, одно решение - преобразовать холст в изображение, как показано ниже

UIGraphicsBeginImageContext(self.canvas.bounds.size);
[self.canvas.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newCombinedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

теперь это прекрасно работает, но проблема с этим решением заключается в том, что изображение обрезается до размеров холста, поэтому разрешение очень низкое.

другой вариант, который я изучил, заключался в том, чтобы использовать некоторые пользовательские категории UIImage для поворота и масштабирования.

[[[self.photoImage image] imageRotatedByDegrees:rotaton_angle] 
     imageAtRect:CGRectMake(x,y width,height)]

Мне нужно предоставить угол поворота (угол поворота, предоставляемый делегатом UIGesture, не находится в градусах или радиантах, тогда есть x, y, width, height, я предполагаю, что эти потребности должны быть рассчитаны на основе некоторого масштаба (я делаю получить значение масштаба от делегата UIGesture, но они не кажутся правильными для этой функции)

здесь есть ряд решений, которые помогут вам обрезать и получить изображение с прямым. но в моем случае прямоугольник не совпадает с масштабом, так как изображение также включает поворот.

любая помощь будет оценена.

4b9b3361

Ответ 1

Мне удалось это решить, вот мое решение, это определенно не самое чистое, но оно работает.

Мне нужно было обрабатывать 3 вещи, панорамировать, масштабировать и вращать.

во-первых, я использовал делегат UIGestureRecognizer для получения нарастающих кумулятивных значений в UIGestureRecognizerStateEnded для всех 3.

то для вращения я просто использовал категорию UIImage, обсуждаемую здесь здесь

    self.imagetoEdit = [self.imagetoEdit imageRotatedByRadians:total_rotation];

для масштабирования (масштаб) я использовал GPUImage (я использую это во всем приложении)

GPUImageTransformFilter *scaleFilter = [[GPUImageTransformFilter alloc] init];
[scaleFilter setAffineTransform:CGAffineTransformMakeScale(total_scale, total_scale)];
[scaleFilter prepareForImageCapture];
self.imagetoEdit = [scaleFilter imageByFilteringImage:self.imagetoEdit];

для панорамирования, im делая это. (Не самый чистый код: S), также используя вышеупомянутое упоминание UIImage + Categories.

CGFloat x_ = (translation_point.x/canvas.frame.size.width)*self.imagetoEdit.size.width;
CGFloat y_ = (translation_point.y/canvas.frame.size.height)*self.imagetoEdit.size.height;
CGFloat xx = 0;
CGFloat yy = 0;
CGFloat ww = self.imagetoEdit.size.width-x_;
CGFloat hh = self.imagetoEdit.size.height-y_;

if (translation_point.x < 0) {
    xx = x_*-1;
    ww = self.imagetoEdit.size.width + xx;
}

if (translation_point.y < 0) {
    yy = y_*-1;
    hh = self.imagetoEdit.size.height + yy;
}

CGRect cgrect = CGRectMake(xx,yy, ww, hh);
self.imagetoEdit = [self.imagetoEdit imageAtRect:cgrect];

все работает.