绘制屏幕外的彩色方块会返回灰度图像

时间:2010-03-05 00:30:01

标签: iphone cocoa-touch core-graphics

我问this question earlier,现在正试图探索制作屏幕外图像的想法。

出了点问题 - 我想也许有色彩空间?我已经将代码向下和向下煮沸,直到我最终只用几行来证明这个问题。

我有一个带有imageview(称为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 个答案:

答案 0 :(得分:4)

如果你有一个CGColor对象,只需使用the CGContextSetFillColorWithColor function

答案 1 :(得分:0)

找到答案

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

在上述场景中失败(但在drawRect中使用时有效!)

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

正常工作。

我认为这对我来说显示了一整个无知的领域。如果有人能够解释或指出我正确的文件,我将非常感激。

答案 2 :(得分:0)

这种情况正在发生,因为CGContextSetFillColor()除非在上下文生命周期的某个时刻首先调用CGContextSetFillColorSpace(),否则无效。

CGContextSetFillColorWithColor()CGContextSetRGBFillColor()都设置了填充色彩空间,这就是为什么这些工作原理。

正如Peter Hosey所说,你的例子中最好的事情是CGContextSetFillColorWithColor()