Swift 调整NSImage的大小会改变其原点并产生错误的结果

Swift 调整NSImage的大小会改变其原点并产生错误的结果,swift,xcode,macos,nsimage,Swift,Xcode,Macos,Nsimage,我正在使用以下代码调整图像大小(保持纵横比)。当我尝试将大小为2432X3648像素的图像调整为1800X2700像素时 输出图像原点发生偏移 extension NSImage { func resizeTo(width: CGFloat, height: CGFloat) -> NSImage { let ratioX = width / size.width let ratioY = height / size.height var ratio

我正在使用以下代码调整图像大小(保持纵横比)。当我尝试将大小为2432X3648像素的图像调整为1800X2700像素时 输出图像原点发生偏移

extension NSImage {   


  func resizeTo(width: CGFloat, height: CGFloat) -> NSImage {
    let ratioX = width / size.width
    let ratioY = height / size.height
    var ratio = ratioX < ratioY ? ratioX : ratioY
    let newHeight = size.height * ratio
    let newWidth = size.width * ratio
    let canvasSize = CGSize(width: newWidth, height: newHeight)
    let img = NSImage(size: canvasSize)
    img.lockFocus()
    let context = NSGraphicsContext.current()
    context?.imageInterpolation = .high
    draw(in: NSRect(origin: .zero, size: NSSize(width: newWidth,height: newHeight)), from: NSRect(origin: .zero, size: size) , operation: .copy, fraction: 1)
    img.unlockFocus()
    return img
    }


}
扩展NSImage{
func resizeTo(宽度:CGFloat,高度:CGFloat)->NSImage{
让ratioX=宽度/尺寸.width
let ratioY=高度/尺寸高度
var比率=比率<比率?比率:比率
设newHeight=size.height*比率
设newWidth=size.width*ratio
let canvasSize=CGSize(宽度:newWidth,高度:newHeight)
让img=NSImage(大小:画布大小)
img.lockFocus()
let context=NSGraphicsContext.current()
上下文?.imageInterpolation=.high
绘制(在:NSRect(原点:.0,大小:NSSize(宽度:newWidth,高度:newHeight)),从:NSRect(原点:.0,大小:size),操作:.copy,分数:1)
img.unlockFocus()
返回img
}
}
请查看已调整大小的示例图像。我已标记了该图像。在其他情况下,调整大小的代码似乎工作正常。请提供建议

更新: @LeoDabus我使用了你的代码,它对输出大小1084X2086像素产生了类似的结果。我不得不稍微修改你的代码,因为它不会编译。编译器自动建议它。 NSGraphicsContext.current()?.imageInterpolation=.high

func resizeTo(宽度:CGFloat,高度:CGFloat)->NSImage{
让ratioX=宽度/尺寸.width
let ratioY=高度/尺寸高度
let ratio=ratioX
实际的错误只是画布大小,它应该使用新的宽度和高度:

extension NSImage {
    func resizedTo(width: CGFloat, height: CGFloat) -> NSImage {
        let ratio = min(canvas.width/size.width, canvas.height/size.height)
        let canvasSize = NSSize(width: size.width * ratio, height: size.height * ratio)
        let img = NSImage(size: canvasSize)
        img.lockFocus()
        NSGraphicsContext.current?.imageInterpolation = .high
        draw(in: NSRect(origin: CGPoint(x: (canvasSize.width - (size.width * ratio)) / 2, y: (canvasSize.height - (size.height * ratio)) / 2), size: canvasSize), from: NSRect(origin: .zero, size: size), operation: .copy, fraction: 1)
        img.unlockFocus()
        return img
    }
}

@LeoDabus感谢您的回复。哪种原始方法?@LeoDabus的“resizedTo”方法似乎相同。。。。我想我已经改变了,因为评论中提到的空白问题。@LeoDabus你看到更新了吗?我投票结束这个问题,因为作者删除了太多的问题,以至于不清楚问题的意图。我得到以下错误
无法在上使用可选链接类型为“()->NSGraphicsContext?”的非可选值
,因此我遵循编译器自动更正,并将其更改为
NSGraphicsContext.current().imageInterpolation=.high
。。。您的新代码会产生相同的错误。请给出建议。第一个建议是将Swift/Xcode更新为最新版本。第二,我已经在这里测试了这个方法,它可以适当地扩展。请确保已正确设置图像视图约束,并且正在使用正确的图像对齐方式谢谢您的回复。我将更新xcode..您是否测试过将2432X3648像素转换为1800X2700..我不明白对齐是什么意思…如果您不发布代码,我只能猜测。我不使用图像视图中的图像。。。我从磁盘加载映像并创建NSImage。明天我将发布更多代码。请检查我告诉您的具体大小…代码在某些情况下似乎工作正常。
extension NSImage {
    func resizedTo(width: CGFloat, height: CGFloat) -> NSImage {
        let ratio = min(canvas.width/size.width, canvas.height/size.height)
        let canvasSize = NSSize(width: size.width * ratio, height: size.height * ratio)
        let img = NSImage(size: canvasSize)
        img.lockFocus()
        NSGraphicsContext.current?.imageInterpolation = .high
        draw(in: NSRect(origin: CGPoint(x: (canvasSize.width - (size.width * ratio)) / 2, y: (canvasSize.height - (size.height * ratio)) / 2), size: canvasSize), from: NSRect(origin: .zero, size: size), operation: .copy, fraction: 1)
        img.unlockFocus()
        return img
    }
}