0

非常奇怪的行为,但我认为我已经尽可能缩小了问题的范围

我有一个NSImage,我们就叫它吧inputImage。它由 aNSBitmapImageRep中的 a表示CGColorSpaceCreateDeviceGray,如果这很重要的话

我想从中创建一个CGImageRef,但颜色倒置。

  NSData *data = [inputImage TIFFRepresentation];
  CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

  NSBitmapImageRep *maskedRep = (NSBitmapImageRep*)[inputImage representations][0];
  CGFloat decode[] = {0.0, 1.0};

  maskRef = CGImageMaskCreate(maskedRep.pixelsWide,
                              maskedRep.pixelsHigh,
                              8,
                              maskedRep.bitsPerPixel,
                              maskedRep.bytesPerRow,
                              provider,
                              decode,
                              false);

  NSImage *testImage = [[NSImage alloc] initWithCGImage:maskRef size:NSMakeSize(1280,1185)]; //the size of the image, hard-coded for testing
  NSLog(@"testimage: %@", testImage);

问题是当我查看时testImage,所有像素都从原始图像向右略微偏移。

inputImage
在此处输入图像描述

testImage
在此处输入图像描述

查看是否保存图片要容易得多,但您会注意到其中的所有内容都testImage向右偏移了大约 5 个像素左右。您会在中的黑色内容左侧看到一个白色间隙testImage

在我的 5 行代码中的某处,我以某种方式移动了我的图像。有人知道这是怎么发生的吗?我目前怀疑TIFFRepresentation

4

1 回答 1

2

您传递给的数据提供者CGImageMaskCreate()应该是其他参数指定的形式的原始像素,而不是图像文件格式。您不应该传递 TIFF 数据。坦率地说,我很惊讶你得到任何与你的原始图像很相似的东西,而不是噪音/垃圾。我猜 TIFF 数据没有被压缩,纯属偶然。您实际上可以在蒙版的左上角看到一点噪点,即被解释为像素的 TIFF 标头。

可能,您最好的选择是CGImage从您的inputImage(或者,根据inputImage创建方式,跳过NSImage并使用API 或CGImage直接从文件创建)。要从 中获取 a ,请使用.CGImageSourceCGImageCreateWith{JPEG,PNG}DataProvider()CGImageNSImage-CGImageForProposedRect:context:hints:

然后,从中获取数据提供者CGImage并从中创建掩码,使用从第一次使用各种函数CGImage查询的各种属性(宽度、高度、bpp 等) 。CGImageCGImageGet...

于 2016-07-18T22:22:57.987 回答