NSImage initWithContentsOfURL在加载TIFF文件时丢失Alpha通道

4
在我的应用程序中,我使用initWithContentsOfURL加载各种类型的图像(JPEG,TIFF,PNG,GIF等)到一个图像中,然后加载到OpenGL纹理中。
唯一加载带有alpha通道的类型是PNG。(在上面的列表中,只有PNG和TIFF可以包含alpha数据。)如果我尝试加载.tiff图像,则会加载没有alpha通道的图像(图像的图像表示报告alpha = NO,并且它报告24位/像素。
我可以在PS中编辑带有alpha的图像,将其保存为PNG和TFF,PNG在我的程序中加载具有alpha,但TIFF不会。此外,我可以打开PS中的TIFF图像并确认它确实具有alpha数据。
我在这里错过了什么?为什么我的TIFF图像没有带有alpha通道?是否有另一个appkit调用可以使我的TIFF不会掉落alpha通道?
编辑:
自发布此问题以来,我发现某些4通道TIFF带有alpha数据,而某些则没有。我还没有弄清楚什么工作流程会导致不同的结果。
这个文件在Photoshop中带有alpha通道,但如果您使用-[[NSImage alloc] initWithContentsOfURL]在Cocoa中加载它,则不会带有alpha通道:

图像“红色朱莉娅海马裁剪”

一个类似的带有alpha通道的图像使用上述Cocoa调用确实带有alpha通道:

图像“透明海马”

2个回答

2

我刚才尝试过(在OSX 10.9.4上),这张图片成功加载了,并且具备渐变透明度。我所使用的代码非常简单:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    NSURL *imageURL = [NSURL URLWithString: @"file:/Users/john/Desktop/test.tiff"];
    NSImage *image = [[NSImage alloc] initWithContentsOfURL: imageURL];
    self.imageView.image = image;
}

我进行了两个测试,一个是使用图层创建TIFF格式的图片,另一个是不使用图层创建。两个测试都成功了。我尝试了几种不同的NSImageView背景来验证渐变透明度是否真实。(如果在IB中选择不同的Image View边框样式,背景颜色也会发生变化)。
我使用Photoshop 12(CS5)创建这些图片,并在保存时手动勾选了TIFF选项对话框中的“保存透明度”复选框。
希望这里的内容能帮助您解决问题。从我的测试结果来看,一切都符合预期。

John,感谢您的回复。我正在使用您发布的完全相同的代码来加载我的TIFF文件(-[[NSImage alloc] initWithContentsOfURL])。自从发布问题以来,我已经找到了一些带有alpha通道的4通道TIFF文件。我编辑了我的问题,包括可以正确工作和不能正确工作的示例图像。非常奇怪... - Duncan C
邓肯,非常有趣。谢谢你让我知道。 - John Cook

1
问题肯定出在图片保存上,很可能是使用的TIFF选项所导致的。
使用您提供的两张图片,“红色朱丽叶海马剪裁”图片没有显示透明度,但“透明海马”可以正确显示透明度。
我在Photoshop中打开了“红色朱丽叶海马剪裁”图片并重新保存了该图片(未更改),但确保在“TIFF选项”对话框中选择了“保存透明度”复选框。保存后,该图片现在在应用程序中正确显示透明度。

screen shot TIFF options screen shot output from application


PS中的“保存透明度”设置确实似乎起到了作用。真正奇怪的是,我发布的图像在PS中加载时会显示alpha通道。此外,我敢肯定我通过编程生成的TIFF文件在Cocoa中加载时没有alpha通道。不过现在我无法重复这个问题了。 - Duncan C
据我所知,透明度在任何情况下都保存在TIFF文件中,但“保存透明度”选项会在文件中设置一种“标志”,告诉使用该文件的应用程序是否要遵守该透明度。我可能解释得不太好,但我想你知道我的意思。 - picciano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接