2010-07-31 4 views
0

Я хочу сохранить предыдущий рисунок в drawRect (система очищает его каждый раз), и кажется, что путь к использованию - использовать контекст растрового изображения и, , это работает, за исключением того, что теперь мой цвет ушел, оставив только черный и белый.мой цветной растровый рисунок только черно-белый в drawRect (iPhone)

Вот мой "статический" контекст

-(id)initWithCoder:(NSCoder *)aDecoder { 
... 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
contextRef = CGBitmapContextCreate(NULL, 
      320, 
      640, 
      8, 
      320*4, 
      colorSpace, 
      kCGImageAlphaPremultipliedLast); 
... 
} 

и вот моя замена контекст:

-(void)drawRect:(CGRect)rect { 
     myDrawRoutine(); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextDrawImage(context, rect, CGBitmapContextCreateImage(contextRef)); 

} 

И это кишок Жеребьевка рутинных по:

... 
// CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextRef context = contextRef; 
if(!(context)) 
    return; 

CGContextSetFillColor(context, CGColorGetComponents([co CGColor])); 
CGContextSetStrokeColor(context, CGColorGetComponents([co CGColor])); 

CGContextFillEllipseInRect(context, CGRectMake((*i)->x, 
       (*i)->y, 
       (*i)->diam, 
       (*i)->diam)); 
... 
} 
+0

Для такой настройки CGLayer лучше подходит для кеширования ваших товарищей, чем для CGBitmapContext. – tonklon

ответ

0

Наконец-то! Благодаря этой теме Extracting rgb from UIColor

Я получил ответ - вместо этого используйте CGContextSetRGBFillColor, а затем передайте его RGB из CGColorGetComponents косвенно.

CGColorRef color = [co CGColor];  
int numComponents = CGColorGetNumberOfComponents(color); 
CGFloat red; 
CGFloat green; 
CGFloat blue; 
CGFloat alpha; 
if (numComponents == 4) 
{ 
    const CGFloat *components = CGColorGetComponents(color); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 

// CGContextSetFillColor(context, CGColorGetComponents([co CGColor])); 
// CGContextSetStrokeColor(context, CGColorGetComponents([co CGColor])); 
CGContextSetRGBFillColor(context, red, green, blue, alpha); 
CGContextSetRGBStrokeColor(context, red, green, blue, alpha); 

CGContextFillEllipseInRect(context, CGRectMake((*i)->x, 
               (*i)->y, 
               (*i)->diam, 
               (*i)->diam)); 
} 
0

Благодаря tonclon

Это сделало ад увеличения скорости :)

Но она по-прежнему привлекает в черном и белом :(

Вот код выше + модификация ...

Вот мой «статический контекст «: не

-(id)initWithCoder:(NSCoder *)aDecoder { 
    ... 
    } 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    contextRef = CGBitmapContextCreate(NULL, 
        320, 
        640, 
        8, 
        320*4, 
        colorSpace, 
        kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colorSpace); 

    cglayer = CGLayerCreateWithContext(contextRef, CGSizeMake(320.0f, 640.0f), NULL); 
    contextRef = CGLayerGetContext(cglayer); 
    ... 
    } 

и вот мой„контекст замены“, то есть cglayer используется вместо (контекст больше не заменяется).

-(void)drawRect:(CGRect)rect { 
    for(std::vector<Body*>::iterator i = bodyVec.begin(); i < bodyVec.end(); ++i) 
     move(i); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

// CGContextDrawImage(context, rect, CGBitmapContextCreateImage(contextRef)); 
    CGContextDrawLayerInRect(context, rect, cglayer); 

} 

("кишок DRAW рутинных" The остаются теми же.)

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