NSImage 无法缩放

2024-03-07

我正在开发一个快速应用程序,其中我有一种方法可以将 @2x 图像重新缩放为常规图像。问题是它没有:(

Why?

-(BOOL)createNormalImage:(NSString*)inputRetinaImagePath {

    NSImage *inputRetinaImage = [[NSImage alloc] initWithContentsOfFile:inputRetinaImagePath];



    NSSize size = NSZeroSize;
    size.width = inputRetinaImage.size.width*0.5;
    size.height = inputRetinaImage.size.height*0.5;

    [inputRetinaImage setSize:size];


    NSLog(@"%f",inputRetinaImage.size.height);


    NSBitmapImageRep *imgRep = [[inputRetinaImage representations] objectAtIndex: 0];

    NSData *data = [imgRep representationUsingType: NSPNGFileType properties: nil];

    NSString *outputFilePath = [[inputRetinaImagePath substringToIndex:inputRetinaImagePath.length - 7] stringByAppendingString:@".png"];

    NSLog([@"Normal version file path: " stringByAppendingString:outputFilePath]);
    [data writeToFile:outputFilePath atomically: NO];
    return true;
}

您必须非常警惕 NSImage 的大小属性。它不一定指的是 bitmapRepresentation 的像素尺寸,例如它可以指显示的大小。 NSImage 可能有许多位图表示以用于不同的输出大小。

同样,更改 NSImage 的大小属性不会改变 bitmapRepresentations

因此,您需要做的是计算出您想要的输出图像的大小,然后使用源 UIImage 中的位图表示形式以该大小绘制新图像。

获得该大小取决于您获取输入图像的方式以及您对它的了解。例如,如果您确信您的输入图像只有一个 bitmapImageRep,您可以使用这种类型的东西(作为 NSImage 上的类别)

  - (NSSize) pixelSize
{
    NSBitmapImageRep* bitmap = [[self representations] objectAtIndex:0];
    return NSMakeSize(bitmap.pixelsWide,bitmap.pixelsHigh);
}

即使您有多个位图图像代表,第一个应该是最大的一个,如果这是创建 Retina 图像的尺寸,那么它应该是您想要的 Retina 尺寸。

确定最终尺寸后,您可以制作图像:

- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size
{

    NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);     
    NSImage* targetImage = nil;
    NSImageRep *sourceImageRep =
    [sourceImage bestRepresentationForRect:targetFrame
                                   context:nil
                                     hints:nil];

    targetImage = [[NSImage alloc] initWithSize:size];

    [targetImage lockFocus];
    [sourceImageRep drawInRect: targetFrame];
    [targetImage unlockFocus];

return targetImage; 

}

update

这是 NSImage 上像素大小获取类别的更详细版本...让我们对图像不做任何假设,它有多少个 imageReps,是否有anybitmapImageReps...这将返回它可以找到的最大像素尺寸。如果它找不到 bitMapImageRep 像素尺寸,它将使用它可以获得的任何其他尺寸,这很可能是边界框尺寸(由 eps 和 pdf 使用)。

NSImage+PixelSize.h

#import <Cocoa/Cocoa.h>
#import <QuartzCore/QuartzCore.h>

@interface NSImage (PixelSize)

- (NSInteger) pixelsWide;
- (NSInteger) pixelsHigh;
- (NSSize) pixelSize;

@end

NSImage+PixelSize.m

#import "NSImage+PixelSize.h"

@implementation NSImage (Extensions)

- (NSInteger) pixelsWide
{
    /*
     returns the pixel width of NSImage.
     Selects the largest bitmapRep by preference
     If there is no bitmapRep returns largest size reported by any imageRep.
     */
    NSInteger result = 0;
    NSInteger bitmapResult = 0;

    for (NSImageRep* imageRep in [self representations]) {
        if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
            if (imageRep.pixelsWide > bitmapResult)
                bitmapResult = imageRep.pixelsWide;
        } else {
            if (imageRep.pixelsWide > result)
                result = imageRep.pixelsWide;
        }
    }
    if (bitmapResult) result = bitmapResult;
    return result;

}

- (NSInteger) pixelsHigh
{
    /*
     returns the pixel height of NSImage.
     Selects the largest bitmapRep by preference
     If there is no bitmapRep returns largest size reported by any imageRep.
     */
    NSInteger result = 0;
    NSInteger bitmapResult = 0;

    for (NSImageRep* imageRep in [self representations]) {
        if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
            if (imageRep.pixelsHigh > bitmapResult)
                bitmapResult = imageRep.pixelsHigh;
        } else {
            if (imageRep.pixelsHigh > result)
                result = imageRep.pixelsHigh;
        }
    }
    if (bitmapResult) result = bitmapResult;
    return result;
}

- (NSSize) pixelSize
{
    return NSMakeSize(self.pixelsWide,self.pixelsHigh);
}

@end

你会#import "NSImage+PixelSize.h"在您当前的文件中以使其可访问。

使用此图像类别和 resize: 方法,您可以这样修改您的方法:

//size.width = inputRetinaImage.size.width*0.5;
//size.height = inputRetinaImage.size.height*0.5;
size.width  = inputRetinaImage.pixelsWide*0.5;
size.height = inputRetinaImage.pixelsHigh*0.5;

//[inputRetinaImage setSize:size];
NSImage* outputImage = [self resizeImage:inputRetinaImage size:size];

//NSBitmapImageRep *imgRep = [[inputRetinaImage representations] objectAtIndex: 0];
NSBitmapImageRep *imgRep = [[outputImage representations] objectAtIndex: 0];

That should为你解决问题(附带条件:我还没有在你的代码上测试它)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSImage 无法缩放 的相关文章

  • 为什么 WebView 中的 dataWithPDFInsideRect 不能在 Mavericks 上创建高质量的 PDF?

    Run 示例项目 https github com tvarghese TestWebView并观察桌面上生成的输出 PDF 名为保存网页 pdf 粘贴感兴趣的代码片段 NSURL url NSBundle mainBundle URLFo
  • Mac OS X 中 Bash 脚本中的 SFTP 命令

    我需要使用 SFTP 和 SSH 从 Mac 主机将文本文件传输到远程 PC freeSSH 这两个连接在本地网络中 那么有没有办法从 Bash 脚本内部运行 SFTP 命令 使用提供的用户名和密码 我已经尝试过一些脚本expect 但我没
  • Cocoa 中播客应用程序的 Apple Api

    我正在为 mac 创建一个播客应用程序 用户可以在其中搜索 itunes 上的播客 是否有苹果内置的 api 我可以通过它从苹果 itunes 搜索和播放播客 或任何其他用于从 itunes 搜索播客的 api 谢谢 Edit 现在我找到并
  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以
  • 使用UDID创建唯一的用户身份

    我正在开发一个 iPhone 应用程序 它与服务器通信以存储和交换数据 因为我想让它尽可能简单 所以我想避免用户帐户的注册 或者也可能使用密码 是否有可能 并且允许 获取 iPhone 设备的 UDID 并制作例如 它的 MD5 哈希值 我
  • UITableViewCell 内的 UIPageViewController

    嘿我想问如何在 UITableViewCell 内实现 UIPageViewController 我一直在阅读周围的内容 但到目前为止似乎对任何尝试的人都不起作用 我希望得到一些提示 不需要完整的答案 谢谢 目前还不清楚你到底想做什么 但让
  • 检测用户何时清除通知中心的通知

    我的应用程序需要知道用户是否使用清除按钮从通知中心删除 清除应用程序通知 是否可以检测用户何时从通知中心删除通知或抓取通知中心上的一组通知 你 即App 无法与NotificationCenter交互 NotificationCenter与
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • 小视频播放

    根据我从互联网收集的信息 MPMoviePlayerController 类不支持小视频播放 因此 为了死马当活马医 我想知道可以使用什么样的方法来让小视频在屏幕的一角播放 而不中断屏幕的其余部分 到目前为止 我们已经遇到了两种可行的解决方
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • Objective-C++ 中的 boost::shared_ptr

    这是对我之前提出的一个问题的更好理解 我有以下 Objective C 对象 interface OCPP MyCppobj cppobj end implementation OCPP OCPP init cppobj new MyCpp
  • 在 OS X 上以编程方式禁用环境光传感器屏幕调暗

    我已经在内核代码仓库中挖掘了好几天了 但我在任何地方都找不到这个 我想禁用 启用 检测许多高端 Mac 笔记本电脑所具有的基于环境光传感器的屏幕调光的状态 这是通过显示控制面板中的 自动调整亮度 复选框激活的调光 请注意 我是NOT谈论半暗
  • 使用 Swift 创建 NSAlert

    我有在 Objective C 中创建和 NSAlert 的代码 但我现在想在 Swift 中创建它 该警报旨在确认用户想要删除文档 我想要 删除 按钮来运行删除功能 而 取消 按钮只是为了消除警报 我怎样才能用 Swift 写这个 NSA
  • pip 安装 MySQL-python

    我正在尝试在 Mac OS 上安装 MySQLdb for Python 当我数字pip install MySQL pythonshell 返回这样的内容 Collecting MySQL python Using cached http
  • 通过应用程序组在应用程序之间通信和保存数据

    iOS 8 昨天发布了一个有关应用程序组的新 API 以前在应用程序之间共享数据和通信有点混乱 我相信这正是应用程序组旨在纠正的问题 在我的应用程序中 我启用了应用程序组并添加了一个新组 但我找不到任何有关如何使用它的文档 文档和 API
  • SwiftUI 更新主菜单 [已解决] kludgey

    真正的问题 你如何更新mainMenu在 SwiftUI 中 它真的可以工作吗 我在 SwiftUI 中构建了一个基于 MacOS 文档的应用程序 其中包括所有内置的文件菜单命令 即关闭 保存 复制 重命名 等 在保存文档之前 我会验证结构
  • dyld[45923]:库未加载:/usr/local/opt/libavif/lib/libavif.15.dylib

    dyld 45923 Library not loaded usr local opt libavif lib libavif 15 dylib Referenced from lt 735019D8 AF6E 3CD1 9AD4 3BE4
  • 如何更改默认的Python版本?

    我已经在我的 Mac 上安装了 Python 3 2 我跑完之后 Applications Python 3 2 Update Shell Profile command 当我输入时 这很令人困惑Python V在终端它说Python 2
  • 如何将 CIFilter 输出到相机视图?

    我刚刚开始使用 Objective C 我正在尝试创建一个简单的应用程序 它显示带有模糊效果的相机视图 我得到了与 AVFoundation 框架一起使用的相机输出 现在 我正在尝试连接 Core 图像框架 但不知道如何连接 Apple 文
  • 在 64 位 OS X 10.6 上制作胖二进制文件更喜欢 32 位的正确方法?

    假设我问用户 你想在 32 位模式还是 64 位模式下运行 他们选择 32 位 我如何向操作系统注册这一事实 我看过arch http developer apple com mac library documentation Darwin

随机推荐

  • MySQL:基于另一个字段添加序列列

    我正在处理一些遗留代码 数据库 并且需要向数据库添加一个字段 该字段将记录与该 外国 id 相关的序列号 示例表数据 当前 ID ACCOUNT some other stuff 1 1 2 1 3 1 4 2 5 2 6 1 我需要添加一
  • 使用 Qt 显示图像流

    当前的解决方案如下所示 paintlabel h class PaintLabel public QWidget Q OBJECT public explicit PaintLabel QWidget parent 0 public slo
  • JavaScript concat 没有按预期工作,介意详细说明吗?

    因此 我有一个包含国家 地区名称作为键的对象 值是包含一些城市的数组 我想将所有城市放在一个数组中 而不包含国家 地区 这是我的做法 但不明白为什么它不起作用 var cities United Kingdom london Spain i
  • 升级到 Xcode 9 后,cordova 应用程序将无法构建,错误 70,需要配置文件

    昨天我们从 xcode 8 3 2 升级到版本 9 现在我们的企业发行版 apache cordova ios 应用程序拒绝构建 2017 09 21 07 37 16 787 xcodebuild 70400 217569 MT IDED
  • 如何获取我的代码的结束地址

    我正在为一个课程项目从头开始编写一个实时操作系统 在将代码下载到芯片后 我想知道代码的结束地址 因为我计划将空闲内存用于堆栈空间 并且需要确保不会覆盖现有代码 我听说 GCC 提供的 end 变量是代码的结尾 但我不知道 end 的含义是什
  • 在后台运行时像 Pastebot 一样抓取 UIPasteboard

    我知道这是可能的 因为 Tapbots Pastebot 就是这么做的 我试图在我的 iPhone 应用程序在后台运行时抓取 UIPasteboard 并将其添加到 UITableView 中 就像 Pastebot 所做的那样 但我也尝试
  • 查找 Git 提交来自哪个分支

    有没有办法根据给定的情况找出提交来自哪个分支SHA 1 http en wikipedia org wiki SHA 1哈希值 如果您能告诉我如何使用 Ruby Grit 来完成此任务 那就加分了 虽然 Dav 的说法是正确的 即信息并未直
  • 安卓。以列表视图显示联系人

    我想在列表视图中显示联系人 并对所有联系人添加操作 例如单击特定联系人 它应该显示电话号码 邮件 ID 和删除特定联系人 import android app ListActivity import android content Cont
  • 为什么我无法以编程方式查看 Android 中所有正在运行的应用程序?

    我试图列出所有正在运行的应用程序 但我不知道为什么我不能这样做 当我尝试运行以下命令时 我只返回了我的应用程序 List
  • 如何使用 Django ORM 在没有数百个查询的情况下选择多对一对多?

    我的数据库具有以下架构 class Product models Model pass class Tag models Model product models ForeignKey Product attr1 models CharFi
  • 多个WebGLRenderer可以渲染同一个场景吗?

    是否可以使用两个实例WebGLRenderer 使用两个Canvas渲染相同的场景 var renderer new THREE WebGLRenderer canvas canvas1 renderer setSize 100 100 v
  • C# 锁定 WinForm 控件

    在我编写的程序中 用户可以向窗体添加控件并移动它们 并在伪设计模式下设置一些属性 我希望能够在按下按钮切换到 数据模式 时将所有这些控件锁定到一个位置 我怎样才能做到这一点 我希望能够循环遍历所有控件并使用 Lock 属性 但我注意到它没有
  • Xcode:尝试在 iOS 模拟器中运行应用程序时出现无效符号链接错误

    在我的应用程序编译阶段结束时 我看到无效的符号链接错误 这只是我每次运行时创建的一些临时目录 我尝试删除它但无济于事 该应用程序在设备上运行良好 任何帮助将非常感激 当您的应用程序包含指向应用程序包外部的符号链接时 通常会发生该错误 在为设
  • 在javascript中,使用回调执行多个异步函数的最佳实践是什么?

    有一个函数需要调用不确定数量的其他 可能异步 函数 每个函数都带有回调 我使用以下模式 虽然很确定它是正确的 但在美学上不太令人愉悦 fn responsible for figuring out and calling aysnc fun
  • Excel VBA从url获取网站标题

    Excel VBA 中的 HTML 页面标题 https stackoverflow com questions 7625316 html page title in excel vba 14509576 14509576 我知道这已经相当
  • Netty 4.0多端口,每个端口有不同的协议

    我想 netty 是我所知道的最好的 java 网络框架 在阅读并尝试一些示例后我有疑问 1 使用netty 4 0创建具有不同协议的多端口网络服务器的最佳方法是什么 每个服务器创建 EventLoopGroup bossGroup new
  • 如何覆盖引导样式

    我创建了轮播 我需要覆盖样式指示器按钮 我有风格 carousel indicators position absolute bottom 10px left 50 z index 1 width 60 padding left 0 mar
  • D2009 TStringlist ansisstring

    夏天的商业平静已经开始 所以我开始迁移到 D2009 我粗略地确定了程序的每个子系统是否应该保留 ascii 或者可以是 unicode 然后开始移植 一切都很顺利 所有组件都在 D2009 版本中 有些组件 如 VSTView 虽然稍微不
  • 如何将多个参数传递给 apply 函数

    我有一个名为 count 的方法 它需要 2 个参数 我需要使用 apply 方法来调用此方法 但是 当我将两个参数传递给 apply 方法时 出现以下错误 类型错误 counting 恰好需要 2 个参数 给定 1 个 我看过以下主题py
  • NSImage 无法缩放

    我正在开发一个快速应用程序 其中我有一种方法可以将 2x 图像重新缩放为常规图像 问题是它没有 Why BOOL createNormalImage NSString inputRetinaImagePath NSImage inputRe