Macos 加载TIFF时,NSImage INITWITH CONTENTS URL缺少alpha通道

Macos 加载TIFF时,NSImage INITWITH CONTENTS URL缺少alpha通道,macos,tiff,nsimage,Macos,Tiff,Nsimage,在我的应用程序中,我使用initWithContentsOfURL将各种类型的图像(JPEG、TIFF、PNG、GIF等)加载到图像中,然后加载到OpenGL纹理中 使用alpha通道加载图像的唯一类型是png。(在上面的列表中,只有PNG和TIFF可以包含alpha数据。)如果我尝试加载.TIFF图像,它会在没有alpha通道的情况下加载(图像的图像代表报告alpha=NO,它报告bitsPerPixel为24) 我可以在PS中编辑带有alpha的图像,将其保存为PNG和TFF,然后在我的程序

在我的应用程序中,我使用initWithContentsOfURL将各种类型的图像(JPEG、TIFF、PNG、GIF等)加载到图像中,然后加载到OpenGL纹理中

使用alpha通道加载图像的唯一类型是png。(在上面的列表中,只有PNG和TIFF可以包含alpha数据。)如果我尝试加载.TIFF图像,它会在没有alpha通道的情况下加载(图像的图像代表报告alpha=NO,它报告bitsPerPixel为24)

我可以在PS中编辑带有alpha的图像,将其保存为PNG和TFF,然后在我的程序中加载带有alpha的PNG,但TIFF没有。此外,我可以在PS中打开TIFF图像,并确认它确实具有alpha数据

我在这里遗漏了什么?为什么我的TIFF图像没有加载alpha通道?我是否可以调用另一个appkit来加载我的TIFF而不会将alpha通道掉到地板上

编辑:

自从发布这个问题以来,我发现一些4通道TIFF加载了alpha数据,而一些没有加载。我还没有弄清楚是什么工作流程导致了不同的结果

此文件在Photoshop中使用alpha通道加载,但如果您使用
-[[NSImage alloc]initWithContentsOfURL]在Cocoa中加载它,则不会加载:

同样具有alpha通道的类似图像使用上述Cocoa调用加载alpha:

我刚刚尝试过(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中选择不同的图像视图边框样式,背景颜色也会改变)

我使用Photoshop 12(CS5)创建图像,并在保存时手动选中TIFF选项对话框中的“保存透明度”复选框


希望这里有一些东西能帮助您了解您的问题。从我的测试来看,一切正常。

问题肯定与图像的保存方式有关,最有可能是使用的TIFF选项

使用您的两幅图像,“红色Julia Seahorse裁剪”图像没有以透明方式显示,但“透明海马”以透明方式正确显示

我在Photoshop中打开了“红色Julia Seahorse裁剪”并重新保存了图像(未更改),但确保在“TIFF选项”对话框中选中了“保存透明度”复选框。保存后,该图像现在在应用程序中正确显示透明度


John,感谢您的回复。我使用的代码与您发布的加载我的TIFF的代码完全相同(
-[[NSImage alloc]initWithContentsOfURL]
)。自从发布我的问题后,我发现一些4通道TIFF确实加载了alpha。我编辑了我的问题,以包含正确工作和不正确工作的示例图像。非常奇怪…Duncan,非常有趣。感谢您让我知道。保存透明度PS中的设置似乎确实起到了作用。真正奇怪的是,如果在PS中加载,我发布的图像将显示alpha。另外,我发誓我通过编程生成的TIFF没有在Cocoa中加载alpha。不过,我现在不能重复。据我所知,透明度保存在TIFF文件中的c或c中ase,但“保存透明度”选项在文件中设置了一个“标志”,告诉消费应用程序是否遵守该透明度。我可能是在歪曲这个解释,但我想你知道我的意思。