如何操作Xcode中CGImageRef中的像素值

时间:2014-06-06 21:40:16

标签: ios image cgimageref

我有一些

CGImageRef cgImage = "something"

有没有办法操纵这个cgImage的像素值?例如,如果此图像包含介于0.0001和3000之间的值,那么当我尝试在NSImageView(How can I show an image in a NSView using an CGImageRef image)中以这种方式查看或释放图像时

我得到一个黑色图像,所有像素都是黑色的,我认为这与在不同的颜色图中设置像素范围值有关(我不知道)。

我希望能够操纵或更改像素值,或者只是通过操纵颜色映射范围来查看图像。

我试过这个,但显然它不起作用:

CGContextDrawImage(ctx, CGRectMake(0,0, CGBitmapContextGetWidth(ctx),CGBitmapContextGetHeight(ctx)),cgImage); 
UInt8 *data = CGBitmapContextGetData(ctx);

for (**all pixel values and i++ **) {
        data[i] = **change to another value I want depending on the value in data[i]**;
        }

谢谢,

1 个答案:

答案 0 :(得分:2)

为了操纵图像中的单个像素

  • 分配缓冲区以容纳像素
  • 使用该缓冲区创建内存位图上下文
  • 将图像绘制到上下文中,将像素放入 缓冲
  • 根据需要更改像素
  • 从上下文
  • 创建新图像
  • 释放资源(注意务必使用仪器检查泄漏)

以下是一些示例代码,可帮助您入门。此代码将交换每个像素的蓝色和红色分量。

- (CGImageRef)swapBlueAndRedInImage:(CGImageRef)image
{
    int x, y;
    uint8_t red, green, blue, alpha;
    uint8_t *bufptr;

    int width  = CGImageGetWidth( image );
    int height = CGImageGetHeight( image );

    // allocate memory for pixels
    uint32_t *pixels = calloc( width * height, sizeof(uint32_t) );

    // create a context with RGBA pixels
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate( pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast );

    // draw the image into the context
    CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image );

    // manipulate the pixels
    bufptr = (uint8_t *)pixels;
    for ( y = 0; y < height; y++)
        for ( x = 0; x < width; x++ )
        {
            red   = bufptr[3];
            green = bufptr[2];
            blue  = bufptr[1];
            alpha = bufptr[0];

            bufptr[1] = red;        // swaps the red and blue
            bufptr[3] = blue;       // components of each pixel

            bufptr += 4;
        }    

    // create a new CGImage from the context with modified pixels
    CGImageRef resultImage = CGBitmapContextCreateImage( context );

    // release resources to free up memory
    CGContextRelease( context );
    CGColorSpaceRelease( colorSpace );
    free( pixels );

    return( resultImage );
}