使用数组的内容在Quartz位图上下文中设置单个像素

时间:2010-03-07 14:53:32

标签: cocoa-touch core-graphics

我有一个数组,其中包含320 x 180显示中每个像素的RGB颜色值。我希望能够在屏幕外相同大小的位图上下文中设置单个像素值,然后在视图中显示位图上下文。

似乎我必须创建1x1 rects并在它们上面设置一个笔划或者在该点上设置长度为1的线。那是对的吗?我正在寻找一种非常有效的方法将数组数据放到图形上下文中,你可以想象这将是一个以每秒25帧的速度循环的图像缓冲区,并且以这种方式绘制似乎效率低下。

我想另一个问题是我应该使用OPENGL ES吗?

非常感谢思考/最佳实践。

此致

戴夫

好的,已经走了一小段路,但无法做出最后的障碍,我不确定为什么这不起作用:

- (void) displayContentsOfArray1UsingBitmap: (CGContextRef)context
{
    long bitmapData[WIDTH * HEIGHT];

    // Build bitmap
    int i, j, h;
    for (i = 0; i < WIDTH; i++)
    {
        for (j = 0; j < HEIGHT; j++)
        {
        h = frameBuffer01[i][j];
        bitmapData[i * j] = h;
        }
}
// Blit the bitmap to the context
    CGDataProviderRef providerRef = CGDataProviderCreateWithData(NULL, bitmapData,4 * WIDTH * HEIGHT, NULL);

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

    CGImageRef imageRef = CGImageCreate(WIDTH, HEIGHT, 8, 32, WIDTH * 4, colorSpaceRef, kCGImageAlphaFirst, providerRef, NULL, YES, kCGRenderingIntentDefault);

    CGContextDrawImage(context, CGRectMake(0.0, HEIGHT, WIDTH, HEIGHT), imageRef);

    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(providerRef);
}

2 个答案:

答案 0 :(得分:1)

阅读CGImageCreate()的文档。基本上,您必须从像素阵列创建CGDataProvider(使用CGDataProviderCreateDirect()),然后使用此数据提供程序作为源创建CGImage。然后,您可以将图像绘制到任何上下文中。要做到这一点有点单调乏味,因为这些函数需要很多参数,但文档非常好。

答案 1 :(得分:1)

戴夫,

blitting代码工作正常,但是从帧缓冲区复制的代码不正确。

// Build bitmap
int i, j, h;
for (i = 0; i < WIDTH; i++)
{
    for (j = 0; j < HEIGHT; j++)
    {
    h = frameBuffer01[i][j];
    bitmapData[/*step across a line*/i + /*step down a line*/j*WIDTH] = h;
    }
}

请注意我对bitmapData元素赋值的更改。

不知道框架的布局,这可能仍然是不正确的,但是从您的代码中,这看起来更接近意图。