如何在不改变色彩空间的情况下获得UIImage负色

时间:2014-01-16 14:33:36

标签: ios objective-c uiimage cgcolorspace

所以,我遵循了这个问题的建议:

how to give UIImage negative color effect

但是当我进行转换时,颜色空间信息会丢失并恢复为RGB。 (我想用灰色)。

如果我在给定代码之前和之后NSLog CGColorSpaceRef,则会确认这一点。

CGColorSpaceRef before = CGImageGetColorSpace([imageView.image CGImage]);
NSLog(@"%@", before);

UIGraphicsBeginImageContextWithOptions(imageView.image.size, YES, imageView.image.scale);

CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);

[imageView.image drawInRect:CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height)];

CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDifference);

CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor whiteColor].CGColor);

CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height));

imageView.image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

CGColorSpaceRef after = CGImageGetColorSpace([imageView.image CGImage]);
NSLog(@"%@", after);

是否有任何方法可以保留色彩空间信息,如果没有,我怎样才能将其更改回来?

修改:在阅读UIGraphicsBeginImageContextWithOptions的文档时,它说:

  

对于在iOS 3.2及更高版本中创建的位图,绘图环境使用预乘的ARGB格式来存储位图数据。如果opaque参数为YES,则将位图视为完全不透明,并忽略其alpha通道。

所以,如果不将它改为CGContext,也许是不可能的?我发现如果我将opaque参数设置为YES,那么它会移除alpha通道,这是足够的(我正在使用的tiff阅读器无法处理ARGB图像)。我仍然希望只有一个灰度图像,以减少文件大小。

1 个答案:

答案 0 :(得分:2)

我发现解决此问题的唯一方法是添加另一种方法,在将图像反转后将图像重新转换为灰度图像。我添加了这个方法:

- (UIImage *)convertImageToGrayScale:(UIImage *)image
{
// Create image rectangle with current image width/height
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);

// Grayscale color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

// Create bitmap content with current image size and grayscale colorspace
CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone);

// Draw image into current context, with specified rectangle
// using previously defined context (with grayscale colorspace)
CGContextDrawImage(context, imageRect, [image CGImage]);

// Create bitmap image info from pixel data in current context
CGImageRef imageRef = CGBitmapContextCreateImage(context);

// Create a new UIImage object
UIImage *newImage = [UIImage imageWithCGImage:imageRef];

// Release colorspace, context and bitmap information
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
CFRelease(imageRef);

// Return the new grayscale image
return newImage;
}

如果有人有任何更简洁的方法,我会很高兴听到它们!