Рисование закрашенного квадратного квадрата возвращает изображение в оттенках серого - PullRequest
1 голос
/ 05 марта 2010

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

Что-то идет не так - думаю, может быть, с цветовым пространством? Я сварил код вниз и вниз и вниз, пока в итоге не смог продемонстрировать проблему всего несколькими строками.

У меня есть вид с изображением (называемый iv) и кнопкой, которая при нажатии вызывает «push»


- (UIImage *) block:(CGSize)size {
    UIGraphicsBeginImageContext(size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColor(context, CGColorGetComponents([UIColor redColor].CGColor));
    CGContextFillRect (context, CGRectMake(0, 0, size.width, size.height));
    UIImage *result =  UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();
    return result;  
}


- (IBAction) push {
    self.iv.image = [self block:CGSizeMake(50.0,50.0)];
}

Проблема здесь в том, что вместо рисования блока 50x50 в указанном цвете он рисует его в оттенках серого, что заставляет меня думать, что это ошибка цветового пространства.

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


- (CGContextRef) createBitmapContextOfSize:(CGSize) size {
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;

    bitmapBytesPerRow   = (size.width * 4);
    bitmapByteCount     = (bitmapBytesPerRow * size.height);

    colorSpace = CGColorSpaceCreateDeviceRGB();
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL) {
        fprintf (stderr, "Memory not allocated!");
        return NULL;
    }
    context = CGBitmapContextCreate (bitmapData,
                                     size.width,
                                     size.height,
                                     8,      // bits per component
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedLast);
    //CGContextSetAllowsAntialiasing (context,NO);
    if (context== NULL) {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
        return NULL;
    }
    CGColorSpaceRelease( colorSpace );
    return context;
}

- (UIImage *) block:(CGSize)size {  
    UIGraphicsBeginImageContext(size);
    CGContextRef context = [self createBitmapContextOfSize:size];
    CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor));
    CGContextFillRect (context, CGRectMake(0, 0, size.width, size.height));
    UIImage *result = [UIImage imageWithCGImage: CGBitmapContextCreateImage (context)];
    CGContextRelease(context);
    UIGraphicsEndImageContext();
    return result;
}

с одинаковыми результатами. Серые коробки не являются (в данном случае) синей коробкой.

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

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

Если у вас есть объект CGColor, просто используйте функцию CGContextSetFillColorWithColor .

0 голосов
/ 15 апреля 2016

Это происходит потому, что CGContextSetFillColor() не имеет никакого эффекта, если CGContextSetFillColorSpace() не был вызван первым в какой-то момент времени существования контекста.

И CGContextSetFillColorWithColor(), и CGContextSetRGBFillColor() также устанавливают цветовое пространство заливки, поэтому они работают.

Как говорит Питер Хоси, в вашем примере лучше всего сделать CGContextSetFillColorWithColor().

0 голосов
/ 05 марта 2010

Нашел ответ

CGContextSetFillColor(context, CGColorGetComponents([UIColor redColor].CGColor));

терпит неудачу в приведенном выше сценарии (но работает при использовании в drawRect!)

CGContextSetRGBFillColor(context, 1, 0, 0, 1);

работает правильно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...