2014-01-12 5 views
2

У меня возникла проблема, когда дело доходит до обрезания фотографии в пользовательский UIBezierPath. Вместо того, чтобы отображать область внутри пути, как и следовало ожидать, она отображает другую часть фотографии (разного размера и положения, чем там, где она должна быть, но все равно такая же форма, как была нарисована). Примечание. Я также хотел бы сохранить полное качество оригинальной фотографии.Обрезание UIImage пользовательской UIBezierPath при сохранении качества изображения

Я включил фотографии и подписи ниже, чтобы объяснить мою проблему более подробно. Если кто-то может дать мне другой способ сделать такое, я с радостью начну.

The user draws a UIBezierPath with his finger Выше иллюстрация UIImage внутри UIImageView, все в пределах UIView которого CAShapeLayer, который отображает UIBezierPath является подслоем. В этом примере предположим, что путь в красном был нарисован пользователем.

Visualization На этой диаграмме изображен CAShapeLayer и графический контекст, созданный с размером оригинального изображения. Как бы я закрепил контекст, чтобы получить результат ниже (пожалуйста, извините его беспорядок)?

The result Это результат, который я хотел бы получить, когда все будет сказано и сделано. Примечание. Мне бы хотелось, чтобы он по-прежнему был того же размера и качества, что и оригинал.

Вот некоторые соответствующие части моего кода:

Это клипы изображения на пути

-(UIImage *)maskImageToPath:(UIBezierPath *)path { 
    // Precondition: the path exists and is closed 
    assert(path != nil); 


    // Mask the image, keeping original size 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0); 

    [path addClip]; 
    [self drawAtPoint:CGPointZero]; 

    // Extract the image 
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return maskedImage; 
} 

Это добавляет очков к UIBezierPath

- (void)drawClippingLine:(UIPanGestureRecognizer *)sender { 
    CGPoint nextPoint = [sender locationInView:self]; 

    // If UIBezierPath *clippingPath is nil, initialize it. 
    // Otherwise, add another point to it. 
    if(!clippingPath) { 
     clippingPath = [UIBezierPath bezierPath]; 
     [clippingPath moveToPoint:nextPoint]; 
    } 
    else { 
     [clippingPath addLineToPoint:nextPoint]; 
    } 

    UIGraphicsBeginImageContext(_image.size); 
    [clippingPath stroke]; 
    UIGraphicsEndImageContext(); 


} 
+0

Все ваши изображения под углом, вы применяете преобразования? Покажите скриншот фактического результата, которого вы достигнете. – Wain

ответ

1

Вы получаете неправильный урожай потому что UIImage масштабируется, чтобы соответствовать внутри UIImageView. В основном это означает, что вам необходимо перевести координаты UIBezierPath в правильные координаты в пределах UIImage. Самый простой способ сделать это - использовать категорию UIImageView, которая преобразует точки с одного вида (в данном случае UIBezierPath, даже если это не совсем представление) в правильные точки в пределах UIImageView. Пример: here. Более конкретно вам нужно будет использовать метод convertPointFromView: в этой категории для преобразования каждой точки в ваш UIBezierPath. (Извините за отсутствие полного кода, я набираю текст на своем телефоне)

+0

Это именно то, что я хотел! У меня было смутное ощущение, что это проблема, и вы только подтвердили это. Это спасло бы меня так много времени, если бы я только знал раньше! – thebradbain

+0

@thebradbain Рад, что это вам помогло. Дайте мне знать, если у вас возникнут проблемы с его использованием. – Gad

Смежные вопросы