Search code examples
cocoaquartz-graphicsquartz-2dcgimage

Decode values ignored in CGCreateImage


I am creating a monochrome image with the following code:

  CGColorSpaceRef cgColorSpace = CGColorSpaceCreateDeviceGray();
  CGImageRef cgImage = CGImageCreate (width, height, 1, 1, rowBytes, colorSpace, 0, dataProvider, decodeValues, NO, kCGRenderingIntentDefault);

where decodeValues is an array of 2 CGFloat's, equal to {0,1}. This gives me a fine image, but apparently my data (which comes from a PDF image mask) is black-on-white instead of white-on-black. To invert the image, I tried to set the values of decodeValues to {1,0}, but this did not change anything at all. Actually, whatever nonsensical values I put into decodeValues, I get the same image.

Why is decodeValues ignored here? How do I invert black and white?


Solution

  • here's some code for creating and drawing a mono image. It's the same as yours but with more context (and without necessary cleanup):

    size_t width = 200;
    size_t height = 200;
    size_t bitsPerComponent = 1;
    size_t componentsPerPixel = 1;
    size_t bitsPerPixel = bitsPerComponent * componentsPerPixel;
    size_t bytesPerRow = (width * bitsPerPixel + 7)/8;
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
    CGBitmapInfo bitmapInfo = kCGImageAlphaNone;
    CGFloat decode[] = {0.0, 1.0};
    size_t dataLength = bytesPerRow * height;
    UInt32 *bitmap = malloc( dataLength );
    memset( bitmap, 255, dataLength );
    
    CGDataProviderRef dataProvider = CGDataProviderCreateWithData( NULL, bitmap, dataLength, NULL);
    
    CGImageRef cgImage = CGImageCreate (
                              width,
                              height,
                              bitsPerComponent,
                              bitsPerPixel,
                              bytesPerRow,
                              colorspace,
                              bitmapInfo,
                              dataProvider,
                              decode,
                              false,
                              kCGRenderingIntentDefault
                              );  
    
    CGRect destRect = CGRectMake(0, 0, width, height);
    CGContextDrawImage( context, destRect, cgImage );
    

    If i change the decode array to CGFloat decode[] = {0.0, 0.0}; i always get a black image. If you have tried that and it didn't have any effect (you say you get the same image whatever values you use), either: you aren't actually passing in those values but you think you are, or: somehow you aren't actually examining the output of CGImageCreate.