получить UIImage (или CGImage) из drawRect - PullRequest
0 голосов
/ 04 марта 2010

Я вызываю следующий код от drawRect


- (void) drawPartial:(UIImage *)img colour:(UIColor *)colour  {

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, self.frame, img.CGImage);

    if (colour!=nil) {
        CGContextSetBlendMode (context, kCGBlendModeColor ); 
        CGContextClipToMask(context, self.bounds, img.CGImage); 
        CGContextSetFillColor(context, CGColorGetComponents(colour.CGColor));
        CGContextFillRect (context, self.bounds);
    }

    self.currentImage=UIGraphicsGetImageFromCurrentImageContext();
    CGContextRestoreGState(context);
}

Infact Я называю это несколько раз, чтобы создать составное изображение, динамически окрашенное в. Каждый переданный img - фактически прозрачное наложение с различной частью изображения на нем.

Я могу создать свое составное изображение, вызывая его несколько раз в drawrect. Проблема возникает, когда я хочу обновить одну часть изображения. В идеале я мог бы вызвать вышеупомянутую функцию и просто изменить одну часть: я пытался играть с self.clearsContextBeforeDrawing безрезультатно.

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

Однако строка self.currentImage = UIGraphicsGetImageFromCurrentImageContext () не возвращает мне текущее изображение, поэтому я не могу создать кэшированную копию.

Любая помощь по любому из подходов была бы очень признательна. (или, очевидно, укажите мне, как я должен это делать!)

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


- (UIImage *) overlayImage:(UIImage *)srcImage withImage:(UIImage *)overlayImage ofColour:(UIColor *)colour   {

    CGSize size =srcImage.size;
    CGRect box = CGRectMake(0, 0, size.width, size.height);

    UIGraphicsBeginImageContext(size);
    CGContextRef context=UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context, 0.0, size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, box, srcImage.CGImage);


    if (colour!=nil) {
        CGContextSetBlendMode (context, kCGBlendModeColor ); //kCGBlendModeMultiply
        CGContextClipToMask(context, box, overlayImage.CGImage); // respect alpha mask
        CGContextSetFillColor(context, CGColorGetComponents(colour.CGColor));
        CGContextFillRect (context, box);
    }

    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    //UIImage *result = [UIImage imageWithCGImage: CGBitmapContextCreateImage (context)];
    UIGraphicsEndImageContext();
    return result;
}

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Как правило, вы хотите, чтобы -drawRect: было максимально простым.

Переместите код для рисования из -drawRect: в метод, который создает и рисует все изображение, которое вы хотите. Уменьшите -drawRect:, чтобы просто объединить это изображение в текущий контекст.

0 голосов
/ 22 сентября 2010

Вполне возможно, что ваш объект UIImage просто не сохраняет сохраненные данные.Кроме того, вы должны знать, что UIImage не является изменяемым типом объекта.Вы получите утечку памяти, если не освободите ее перед переназначением.Попробуйте это:

UIImage *result = [UIGraphicsGetImageFromCurrentImageContext() retain];
...