如何从 NSImage 保存 PNG 文件(视网膜问题)

2023-12-07

我正在对图像进行一些操作,完成后,我想将图像以 PNG 格式保存在磁盘上。我正在执行以下操作:

+ (void)saveImage:(NSImage *)image atPath:(NSString *)path {
        
    [image lockFocus] ;
    NSBitmapImageRep *imageRepresentation = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0.0, 0.0, image.size.width, image.size.height)] ;
    [image unlockFocus] ;
        
    NSData *data = [imageRepresentation representationUsingType:NSPNGFileType properties:nil];
    [data writeToFile:path atomically:YES];
}

这段代码可以工作,但在配备 Retina 屏幕的 Mac 上存在问题;如果我打印NSBitmapImageRep对象,我得到一个不同大小和像素的矩形,当我的图像保存在磁盘上时,它的大小是原来的两倍:

$0 = 0x0000000100413890 NSBitmapImageRep 0x100413890 Size={300, 300} ColorSpace=sRGB IEC61966-2.1 colorspace BPS=8 BPP=32 Pixels=600x600 Alpha=YES Planar=NO Format=0 CurrentBacking=<CGImageRef: 0x100414830>

我试图强制像素大小不关心视网膜比例,因为我想保留原始大小:

imageRepresentation.pixelsWide = image.size.width;
imageRepresentation.pixelsHigh = image.size.height;

这次我在打印时得到了正确的尺寸NSBitmapImageRep对象,但是当我保存文件时,我仍然遇到同样的问题:

$0 = 0x0000000100413890 NSBitmapImageRep 0x100413890 Size={300, 300} ColorSpace=sRGB IEC61966-2.1 colorspace BPS=8 BPP=32 Pixels=300x300 Alpha=YES Planar=NO Format=0 CurrentBacking=<CGImageRef: 0x100414830>

知道如何解决这个问题并保留原始像素大小吗?


如果你有一个NSImage并希望将其作为图像文件保存到文件系统中,您应该never use lockFocus! lockFocus创建一个新图像,确定在屏幕上显示,仅此而已。所以lockFocus使用屏幕的属性:72 dpinormal屏幕和 144 dpiretina屏幕。对于你想要的,我建议使用以下代码:

+ (void)saveImage:(NSImage *)image atPath:(NSString *)path {

    CGImageRef cgRef = [image CGImageForProposedRect:NULL
                                             context:nil
                                               hints:nil];

    NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:cgRef];
    [newRep setSize:[image size]]; // if you want the same resolution
    NSData *pngData = [newRep representationUsingType:NSPNGFileType properties:nil];
    [pngData writeToFile:path atomically:YES];
    [newRep autorelease];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 NSImage 保存 PNG 文件(视网膜问题) 的相关文章

随机推荐

  • 将 Java 类的消息记录回空手道报告

    我们有一个场景 我们必须发布 json 请求 然后验证 UI 中的一些操作 因此 我们有一个空手道功能文件 它会满足请求 然后我们从功能文件中调用一个 java 类 java 类将运行我们的 Selenium Webdriver 测试 在
  • 基于API密钥监控API网关API

    如何监控我的 Amazon API Gateway API API 密钥 目前它显示所有 API 密钥的数据 但我想显示特定 API 密钥的 API 调用 5xx 错误 4xx 错误等 如果您正在考虑监控 APIX Api Key标题级别
  • Firefox 锁定 place.sqlite

    平台 Firefox 3 6 13 Python 2 7 stackless 和 Windows 7 尚未在 Ubuntu 上测试 我会 我尝试使用 apsw 库 conn apsw Connection dir profile place
  • 从不扩展 Application 的类的 Main 方法启动 JavaFX

    我在从未扩展的类的 Main 方法启动 JavaFX 应用程序时遇到问题javafx application Application 在我的应用程序中有MainApp java哪个应该启动重写的方法start in the MainUICo
  • JSON 列表(不是对象)到 Bash 数组?

    我有一个 JSON 列表 包含项目列表的键值对的值 john boris joe frank 我如何将其转换为 bash 数组 以便我可以迭代它们 简单案例 无换行字符串 简单的方法是使用jq将列表转换为每项一行 并将其读入脚本中 json
  • 将数据导出到谷歌表格

    这更多的是关于性能 这是场景 此应用程序用于控制组织中的电脑库存 因此该应用程序有一个由 32 个字段和 1 个关系组成的模型 该模型已保存 2650 条记录 我还有一个将所有记录导出到谷歌表格的过程 尽管它工作得很好 但从我的角度来看 导
  • 在两个上下文之间共享纹理/图像而不需要上下文共享的最佳方法是什么?

    我想要做的是从一个上下文中获取渲染结果 并在另一个不与前一个上下文共享的上下文中进行进一步的渲染 我能想到的唯一方法是使用像 API 这样的 glReadPixels 将渲染结果从 GPU 内存复制到系统内存 并在另一个上下文中使用复制的数
  • php date() 比服务器时间提前一小时(夏令时问题)

    我正在尝试排查并解决这个问题 我正在使用的服务器 Linux 上的 php 5 2 9 具有正确的本地时间 America Buenos Aires user server home site public html date Mon No
  • 合并sqlite

    最近在读sqlite3的源码 在合并版本中 只有四个文件 上官方网站 他们说 合并也使其运行得更快 当我们使用合并来编译 SQLite 而不是单独的源文件时 我们测量到性能提高了 5 到 10 我不明白他们是如何做到的以及为什么 有人有什么
  • NetUIHWND 和 DirectUIHWND [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 使用Spy 工具 似乎某些微软应用程序使用网络UIHWND and 直接UIHWND窗口类 例如 Word 2010 的功能区似乎是 NetUIHW
  • ActiveAdmin:编辑模型实例时下拉菜单太大

    我有两个模型 UserDevice and UserInfo如下 在 schema rb 中 create table user devices force cascade do t t integer user info id t str
  • 在 Neo4j 中将实体与适当的关系相关联?

    我尝试使用 Neo4j 对项目 员工和项目角色之间的关系进行建模 每个项目都有一个称为 项目经理 的角色和一个称为 总监 的角色 我试图在数据模型中实现的是能够说 对于项目 A 主管是员工 X 就我的目的而言 重要的是 项目 员工 和 角色
  • AT&T 汇编语言中的“.=”是什么意思?

    我正在尝试编写一个启动程序 内容如下 text balabala globl start start balabala start 510 byte 0x55 0xaa 顺便说一句 我也无法理解 byte 0x55 0xaa 是什么意思 它
  • 给定一组 n 个整数,返回总和为 0 的 k 个元素的所有子集

    给定一组未排序的n整数 返回总和为 0 的所有大小为 k 的子集 即每个集合有 k 个唯一元素 所以我给了面试官以下解决方案 我研究过极客观点 没有使用额外的空间 一切都就地完成 等等 但是当然成本是 O n k 的高时间复杂度 其中k t
  • django-autocomplete-light 错误 = 'list' 对象没有属性 'queryset'

    我是 django 的新手 我需要你的帮助 在设置我的测试之后 我已经尝试了很多天来理解 django autocomplete light http 192 168 0 108 8000 country autocomplete 工作 数
  • 将列变量字符串从“1”更改为“01”

    我在数据框中有一列是字符类型 变量是 1 01 2 01 3 03 4 04 等的混合 我如何选择所有没有前导 0 和格式的内容 以便它们都是 01 02 03 04 等 我们需要首先将其转换为numeric并使用sprintf df1 c
  • 使用 NetworkX 测量图之间的相似性

    I have 两张图A and B 它们可能是同构的 完全不同的 或者有一些相似之处 很少有节点是相同的 或者很少有节点共享相同的边 我想看看 检查这些图表有多么不同 相似 networkx is isomorphic 是一种方法 然而 这
  • Kohana ORM 和验证,有问题

    尝试使用适用于 Kohana 3 2 的 ORM 进行验证 目前我有我的模型
  • New-Object:找不到“PSCredential”的重载且参数计数:“2”

    我希望将一封电子邮件发送给多个收件人 而且我不想提示输入用户名和密码 所以我使用了下面的字符串转换 但随后我遇到了下面的错误消息 您能否提出解决此问题的答案 string ValidateNotNullOrEmpty secpasswd Q
  • 如何从 NSImage 保存 PNG 文件(视网膜问题)

    我正在对图像进行一些操作 完成后 我想将图像以 PNG 格式保存在磁盘上 我正在执行以下操作 void saveImage NSImage image atPath NSString path image lockFocus NSBitma