将Gamma为1.8应用于NSImage

时间:2011-07-16 20:10:18

标签: objective-c cocoa nsimage gamma nsbitmapimagerep

我正在尝试将NSImage转换为1.8的伽玛,但我没有太多运气。我找到了一些代码,但没有任何工作。我有一个方法在NSImage类别上返回NSBitmapImageRep。

首先,我尝试使用我在网上找到的CGColorSpaceCreateCalibratedRGB函数更改颜色空间,但这没有效果:

- (NSBitmapImageRep *)OnePointEightBitmapImageRep{
    CGColorSpaceRef colorSpace = CGColorSpaceCreateCalibratedRGB(
                                                                 (CGFloat[3]){0.9505, 1.0000, 1.0891},//white point
                                                                 (CGFloat[3]){0.0000, 0.0000, 0.0000},//black point
                                                                 (CGFloat[3]){1.8010, 1.8010, 1.8010},//gamma rgb
                                                                 (CGFloat[9]){0.4543, 0.2426, 0.0148, 0.3533, 0.6744, 0.0904, 0.1566, 0.0834, 0.7195} //rgb tristimulus
                                                                 );

    CGImageRef imageRef = CGImageCreateCopyWithColorSpace([self CGImage], colorSpace);
    NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:imageRef];

    CGColorSpaceRelease(colorSpace);
    CGImageRelease(imageRef);

    return bitmap;
}

- (CGImageRef)CGImage{
    return [self CGImageForProposedRect:nil context:nil hints:nil];
}

接下来,我尝试在位图图像属性上设置gamma:

- (NSBitmapImageRep *)OnePointEightBitmapImageRep{
    NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:[self CGImage]];
    NSLog(@"gamma: %@", [bitmap valueForProperty:NSImageGamma]);

    [bitmap setProperty:NSImageGamma withValue:[NSNumber numberWithDouble:1.8f]];
    NSLog(@"gamma: %@", [bitmap valueForProperty:NSImageGamma]);

    return bitmap;
}

这设置了属性,但对输出图像没有影响。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

来自the docs

  

伽玛值是介于0.0和1.0之间的浮点数   0.0为黑色,1.0为最大颜色。

如您所见,您的1.8值超出此范围。请注意,通过将属性写入PNG文件,设置此属性仅设置PNG图像的灰度系数。它实际上并没有改变图像中的像素值。

如果您想这样做,则应使用Core Image并应用CIGammaAdjust过滤器。