所以,我遵循了这个问题的建议:
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图像)。我仍然希望只有一个灰度图像,以减少文件大小。
答案 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;
}
如果有人有任何更简洁的方法,我会很高兴听到它们!