2010-03-04 5 views
0

Я звоню следующий код из DrawRectполучить UIImage (или CGImage) от 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; 
} 
+0

Вы не можете получить изображение из контекста рисования по умолчанию. Вы можете получить только один, если вы начинаете отдельный (внеэкранный) контекст явно с помощью UIGraphicsBeginImageContext. –

ответ

2

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

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

+0

Я попробовал (возможно, должен был включить эти детали), но возникла одна и та же проблема: я не смог получить композитное изображение. Я тоже обновлю этот код. – Andiih

+0

Это * не * хорошая политика в UIKit; буфер уже поддерживается с кэшированным содержимым слоя. Поддержание отдельного буфера просто расточительно. Лучшая политика заключается в том, чтобы полностью заменить обработку UIKit буфером, управляя контекстом растрового изображения вручную и вызывая '[[self layer] setContents: (id) myCGImage]' – rpetrich

0

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

UIImage *result = [UIGraphicsGetImageFromCurrentImageContext() retain];