2015-08-05 12 views
2

У меня есть CGPath в форме стрелки, которую я рисую в CGContext моего текущего вида. Я хотел бы создать миниатюрный вариант (уменьшенное изображение) стрелки, чтобы добавить его как Image в UITableView, где показаны все выбранные стрелки.обрезка области CGRect от UIGraphicsImageContext

Я преуменьшаю картину полного контекста, который оставляет стрелку меньше, чем она должна быть. В идеале я хотел бы обрезать образ полного контекста до границ стрелки. Однако я еще не успел. Любые вести? Спасибо за помощь!

Вот изображение полного вида, содержащего стрелу и другую фотографию эскиза, который я генерирую. enter image description here enter image description here

В идеале выше эскиз будет обрезан, чтобы содержать только стрелку - не полный контекст.

код я использую это происходит некорректно:

- (UIImage*) imageForObject:(id<GraphicalObject>) object 
        inRect:(CGRect)rect { 

    UIImage *image = [UIImage new]; 
    CGRect objectBounds = [object objectBounds]; 
    UIGraphicsBeginImageContext(self.view.frame.size);//objectBounds.size); 
    CGContextRef context =UIGraphicsGetCurrentContext(); 
    [object drawInContext:context]; 
    //doesn't work 
    CGContextClipToRect(context, objectBounds); 

    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

ответ

0

CGRect называется objectBounds имеет два компонента, в origin и size. Чтобы правильно рисовать объект в виде миниатюры, код должен масштабировать изображение (чтобы получить правильный размер) и перевести изображение (чтобы переместить начало координат на {0,0}). Таким образом, код выглядит так:

- (UIImage *)getThumbnailOfSize:(CGSize)size forObject:(UIBezierPath *)object 
{ 
    // to maintain the aspect ratio, we need to compute the scale 
    // factors for x and y, and then use the smaller of the two 
    CGFloat xscale = size.width/object.bounds.size.width; 
    CGFloat yscale = size.height/object.bounds.size.height; 
    CGFloat scale = (xscale < yscale) ? xscale : yscale; 

    // start a graphics context with the thumbnail size 
    UIGraphicsBeginImageContext(size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // here's where we scale and translate to make the image fit 
    CGContextScaleCTM(context, scale, scale); 
    CGContextTranslateCTM(context, -object.bounds.origin.x, -object.bounds.origin.y); 

    // draw the object and get the resulting image 
    [object stroke]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
+0

Спасибо - это работает для cgpath - однако тогда мне нужно будет заполнить его градиентом. – user1612877

+0

@ user1612877 Используйте '[object drawInContext: context]' вместо '[object stroke]'. Я использовал простой 'UIBezierPath' для тестирования, так как у меня нет кода, который рисует стрелку. – user3386109

+1

Спасибо, что работает для меня. Для целесообразности я хотел бы сказать, что мне пришлось различать четыре случая при рисовании стрелки, где в зависимости от квадранта, на который указывает стрелка, последние два аргумента функции CGContextTranslateCTM(), необходимые для изменения между всеми возможными комбинациями 0/- objectBounds.origin.x, 0/-объектBounds.origin.y – user1612877

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

  • Нет связанных вопросов^_^