NSImage w / BitmapImageRep - >反转颜色的CIImage - >带有BitmapImageRep的NSImage,颜色空间问题

时间:2016-07-12 19:53:29

标签: cocoa core-image nsimage color-space ciimage

所以我有一个NSImage *startingImage 它由带有灰色空间的NSBitmapImageRep表示

我需要反转其上的颜色,因此我将其转换为CIImage

  CIImage *startingCIImage = [[CIImage alloc] initWithBitmapImageRep:(NSBitmapImageRep*)[startingImage representations][0]];
  CIFilter *invertColorFilter = [CIFilter filterWithName:NEVER_TRANSLATE(@"CIColorInvert")];
  [invertColorFilter setValue:startingCIImage forKey:NEVER_TRANSLATE(@"inputImage")];
  CIImage *outputImage = [invertColorFilter valueForKey:NEVER_TRANSLATE(@"outputImage")];

如果我此时查看outputImage,这正是我所期望的,相同的图像除了反色。

然后我将其转换回NSImage,如此:

   NSBitmapImageRep *finalImageRep = [[NSBitmapImageRep alloc] initWithCIImage:outputImage];
   NSImage *finalImage = [[NSImage alloc] initWithSize:[finalImageRep size]];
   [finalImage finalImageRep];

这是我的问题......我的原始NSImage有一个灰色空间,每像素8位。

<NSImage 0x610000071440 Size={500, 440} Reps=(
    "NSBitmapImageRep 0x6100002a1800 Size={500, 440} ColorSpace=Device Gray colorspace BPS=8 BPP=8 Pixels=500x440 Alpha=NO Planar=NO Format=0
CurrentBacking=<CGImageRef: 0x6100001ab0c0>" )>

然而,在我转换所有内容并注销图像之后,这就是我所拥有的

<NSImage 0x61800127e540 Size={500, 440} Reps=(
    "NSBitmapImageRep 0x6080000b8cc0 Size={500, 440} ColorSpace=ASUS PB278 colorspace BPS=8 BPP=32 Pixels=500x440 Alpha=YES Planar=NO
Format=0 CurrentBacking=<CGImageRef: 0x6180001a3f00>" )>

正如您所知,NSBitmapImageRep意味着不可变,当我尝试setColorSpaceNamesetAlpha时,图片最终只是一个黑盒子。

我是否遗漏了某些内容,以便将NSImage转换为CIImage,将黑色和白色反转,然后转换回NSImage

1 个答案:

答案 0 :(得分:0)

也许你可以在最后替换色彩空间:

NSBitmapImageRep* fixedRep = [finalImageRep bitmapImageRepByConvertingToColorSpace: [startingImageRep colorSpace]
    renderingIntent: NSColorRenderingIntentDefault];