How can I manipulate the pixel values in a CGImageRef in Xcode

回眸只為那壹抹淺笑 提交于 2019-12-11 05:49:22

问题


I have some

CGImageRef cgImage = "something"

Is there a way to manipulate the pixel values of this cgImage? For example if this image contains values between 0.0001 and 3000 thus when I try to view or release the image this way in an NSImageView (How can I show an image in a NSView using an CGImageRef image)

I get a black image, all pixels are black, I think it has to do with setting the pixel range values in a different color map (I don't know).

I want to be able to manipulate or change the pixel values or just be able to see the image by manipulating the color map range.

I have tried this but obviously it doesn't work:

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]**;
        }

Thank you,


回答1:


In order to manipulate individual pixels in an image

  • allocate a buffer to hold the pixels
  • create a memory bitmap context using that buffer
  • draw the image into the context, which puts the pixels into the buffer
  • change the pixels as desired
  • create a new image from the context
  • free up resources (note be sure to check for leaks using instruments)

Here's some sample code to get you started. This code will swap the blue and red components of each pixel.

- (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 );
}


来源:https://stackoverflow.com/questions/24091025/how-can-i-manipulate-the-pixel-values-in-a-cgimageref-in-xcode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!