【问题标题】:How to get CGImageForProposedRect to provide 1:1 pixel data on Retina Mac如何让 CGImageForProposedRect 在 Retina Mac 上提供 1:1 像素数据
【发布时间】:2014-02-18 00:38:19
【问题描述】:

在我们的应用程序中,我们正在创建 PDF NSImage(因此可扩展),然后使用 CGImage 例程将该数据写入 TIFF 文件。这在非视网膜显示器 Macintoshes 上运行良好,但在视网膜机器上,返回的数据是我们期望的分辨率的两倍(就像屏幕一样)。

我们使用的代码可以使用一个新形成的NSView 子类,将要绘制的数据(不是原始屏幕视图)引用为printingMapView。

NSData *pdfData = [printingMapView dataWithPDFInsideRect: frame];

NSImage *image = [[NSImage alloc] initWithData: pdfData];
[image setSize: size];

NSRect pRect = NSMakeRect( 0, 0, [image size].width, [image size].height);

CGImageRef cgImage = [image CGImageForProposedRect: &pRect context: NULL hints:NULL];

我四处寻找可以传递给CGImageForProposedRect:context:hints 调用的任何提示,但 Apple 文档中没有与内容规模相关的任何内容。

除了创建一个完整大小的NSBitmapImageRep 并将其作为context 参数传递给CGImageForProposedRect:context:hints 之外,还有其他方法吗?

看来在操作过程中可能会占用大量内存。

【问题讨论】:

  • 运气好吗?
  • @PeterLapisu 不。我继续使用上一段中描述的 NSBitmapImageRep。

标签: macos nsimage cgimage


【解决方案1】:

所以 CGImageForProposedRect 确实返回 1:1 像素数据,如果你从函数中得到一个大小加倍的 CGImage,那么该 NSImage 的 NSImageRep 也必须加倍大小。检查你的代码,看看你是否有任何调用 NSImage drawInRect 你正在写入视网膜上下文。这就是发生在我身上的事情。

【讨论】:

  • 如上所述,这就是正在发生的事情,我理解这一点。问题特别是是否有任何方法可以获取非视网膜数据,而无需在屏幕外创建全尺寸位图上下文以进行绘制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多