【问题标题】:NSImage initWithContentsOfURL missing alpha channel when loading TIFFsNSImage initWithContentsOfURL 在加载 TIFF 时缺少 alpha 通道
【发布时间】:2015-01-07 07:20:08
【问题描述】:

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

加载带有 Alpha 通道的图像的唯一类型是 png。 (在上面的列表中,只有 PNG 和 TIFF 可以包含 alpha 数据。)如果我尝试加载 .tiff 图像,它会在没有 alpha 通道的情况下加载(图像的图像代表报告 alpha=NO,它报告的 bitsPerPixel 为 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 中加载它则不会:

Image "Red Julia Seahorse crop"

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

Image "Transparent Seahorses"

【问题讨论】:

    标签: macos tiff nsimage


    【解决方案1】:

    我刚刚尝试过(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 选项对话框中的“保存透明度”复选框。

    希望这里有一些东西可以帮助您解决您的问题。从我的测试来看,一切都按预期工作。

    【讨论】:

    • 约翰,感谢您的回复。我正在使用与您发布的完全相同的代码来加载我的 TIFF (-[[NSImage alloc] initWithContentsOfURL])。自从发布我的问题以来,我发现了一些加载 alpha 的 4 通道 TIFFS。我编辑了我的问题以包含可以正常工作和不能正常工作的示例图像。很奇怪……
    • 邓肯,很有趣。谢谢你告诉我。
    【解决方案2】:

    问题肯定在于图像的保存方式,很可能是使用的 TIFF 选项。

    使用您的两张图片,“Red Julia Seahorse Crop”图片没有透明显示,但“透明海马”正确显示透明。

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

    【讨论】:

    • PS 中的“保存透明度”设置似乎确实有所作为。真正奇怪的是,如果你在 PS 中加载它,我发布的图像会显示为 alpha。另外,我发誓我以编程方式生成的 TIFF 没有在 Cocoa 中加载 alpha。不过我现在不能重复了。
    • 据我所知,无论哪种情况,透明度都保存在 TIFF 文件中,但是“保存透明度”选项在文件中设置了一个“标志”,告诉消费应用程序是否尊重这种透明度。我可能在扼杀这种解释,但我想你知道我的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2022-12-05
    • 1970-01-01
    • 2018-04-09
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多