【问题标题】:NSImage doesn't work with all imagesNSImage 不适用于所有图像
【发布时间】:2016-05-21 19:27:03
【问题描述】:

我在我的应用程序中使用 NSImage 类加载图像。

 if let image = NSImage(contentsOfURL: openPanel.URL!) {
  ...
 }

它适用于大多数图像。然后我将它转换为 CGImage 并像我想要的那样使用。但是对于某些图像,它只是出现故障,我不明白为什么。例如,如果我加载图像大小2133x2133,它看起来什么都没有,如果我正在打印image.size,我会看到非常奇怪的(511.92, 511.92)

什么会导致这种行为?所有图像均为PNG格式。同时,我可以加载大小为(2048.0, 1536.0) 的图像,一切正常。

如何开始使用 NSImage 调试加载?

这是一个图像的例子:

http://rgho.st/6CVKMR2ZM/image.png

当我使用这个函数创建 CGImage 时,我什么也看不到:

    var imageRect = CGRectMake(0, 0, newImage.size.width, newImage.size.height)
    let imageRef = newImage.CGImageForProposedRect(&imageRect, context: nil, hints: nil)

【问题讨论】:

  • 如果您给我们提供一个不起作用的示例图像文件会有所帮助。
  • 这并不奇怪,这是一张 2133x2133 的图像,图像 DPI 设置为 300 像素/英寸。 (2133/300 = 7.11 英寸 * 72 点/英寸 = 511.92 点);-)。一个示例图像会很有帮助。记录整个图像实例通常可以提供丰富的信息,包括 NSImage 包含的图像代表的类型和数量。 (NSImage 只是一个或多个 NSImageReps 的容器。)
  • @NSGod:抱歉有点迂腐:NSImage 只是 或更多 NSImageReps 的容器
  • 在 10.11.4 我得到一个有效的NSImage 和一个NSBitmapImageRep,我可以毫无问题地显示在NSImageView 中。 imageRef 是有效的,我可以从中制作另一个 NSImage,这也显示正常。它看起来与预览中的完全相同。您究竟如何显示您创建的imageRef?由于它是一个部分透明的图像并且有一个比例,你可能只画了一个透明的角吗?
  • @HeinrichGiesen:是的,忘记了;它通常会有一个或多个,但不一定...

标签: swift macos cocoa nsimage


【解决方案1】:

这是我的解决方案:使用真实图像尺寸,而不是 Apple 使用 DPI 为我计算的尺寸。

    var w = 0
    var h = 0
    for r in newImage.representations {
        w = max(w, r.pixelsWide)
        h = max(h, r.pixelsHigh)
    }
    var imageRect = CGRectMake(0, 0, CGFloat(w), CGFloat(h))
    let imageRef = newImage.CGImageForProposedRect(&imageRect, context: nil, hints: nil)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多