Search code examples
objective-cquartz-graphicsmasking

In Quartz 2D, Is it possible to mask an image by removing everything but the color channel you want?


So I tried to use the Quartz CGImageCreateWithMaskingColors function, but he only problem is that it masks the color range you are selecting.

I want to mask everything but the color range I am selecting. For instance, I want to show all red colors in a picture but remove the other channels (Green and Blue).

I am doing this in Objective-C and I am a noob so please give me examples :)

Any help is greatly appreciated.


Solution

  • use these methods.i found them in one of the SO posts.

    -(void)changeColor
    {
        UIImage *temp23=Image;//Pass your image here
        CGImageRef ref1=[self createMask:temp23];
        const float colorMasking[6] = {1.0, 3.0, 1.0, 2.0, 2.0, 3.0};
        CGImageRef New=CGImageCreateWithMaskingColors(ref1, colorMasking);
        UIImage *resultedimage=[UIImage imageWithCGImage:New];
        EditImageView.image = resultedimage;
        [EditImageView setNeedsDisplay];
    }
    
    -(CGImageRef)createMask:(UIImage*)temp
    {
    
    
        CGImageRef ref=temp.CGImage;
        int mWidth=CGImageGetWidth(ref);
        int mHeight=CGImageGetHeight(ref);
        int count=mWidth*mHeight*4;
        void *bufferdata=malloc(count);
    
        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
        CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
        CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    
        CGContextRef cgctx = CGBitmapContextCreate (bufferdata,mWidth,mHeight, 8,mWidth*4, colorSpaceRef, kCGImageAlphaPremultipliedFirst); 
    
        CGRect rect = {0,0,mWidth,mHeight};
        CGContextDrawImage(cgctx, rect, ref); 
        bufferdata = CGBitmapContextGetData (cgctx);
    
        CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bufferdata, mWidth*mHeight*4, NULL);
        CGImageRef savedimageref = CGImageCreate(mWidth,mHeight, 8, 32, mWidth*4, colorSpaceRef, bitmapInfo,provider , NULL, NO, renderingIntent);
        CFRelease(colorSpaceRef);
        return savedimageref;
    }
    

    then call changecolor method on a buttons click event and see the result