快速图像调整大小并保存分辨率问题

时间:2017-04-28 11:01:12

标签: swift macos resize nsimage

我的图像尺寸有问题。

最初我的图像有任何尺寸,我裁剪到正方形

func cropToSquare() -> NSImage? {
    let dimensions = [self.width, self.height]
    let lessValue = dimensions.min()
    let x = floor((self.width - lessValue!) / 2)
    let y = floor((self.height - lessValue!) / 2)
    let frame = NSMakeRect(x, y, lessValue!, lessValue!)
    guard let rep = self.bestRepresentation(for: frame, context: nil, hints: nil) else {
        return nil
    }
    let img = NSImage(size: NSSize(width: lessValue!, height: lessValue!))
    img.lockFocus()
    defer { img.unlockFocus() }
    if rep.draw(in: NSMakeRect(0, 0, lessValue!, lessValue!),
                from: frame,
                operation: NSCompositingOperation.copy,
                fraction: 1.0,
                respectFlipped: false,
                hints: [:]) {
        return img
    }
    return nil
}

接下来我调整图片大小

func copyWithSize(size: NSSize) -> NSImage? {
    let frame = NSMakeRect(0, 0, size.width, size.height)
    guard let rep = self.bestRepresentation(for: frame, context: nil, hints: nil) else {
        return nil
    }
    let img = NSImage(size: size)
    img.lockFocus()
    defer { img.unlockFocus() }
    if rep.draw(in: frame) {
        print(size, frame)
        return img
    }
    return nil
}

最后使用此answer

中的png扩展名将图片保存到文件

一般来说一切正常......除了图像尺寸。 当我从一些尺寸开始并调整大小以说100x100我保存的图像有双倍尺寸(200x200)。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

图片正在@2x中绘图,因为您的Mac配有Retina显示屏。

使用lockFocus创建一个新图像以便在屏幕上显示,如果要将其保存到文件中,这是不切实际的。

您可以使用以下方式获取缩放系数:

NSScreen.main.backingScaleFactor

并相应调整您的调整大小。

但最好的解决方案是创建NSBitmapImageRep并手动将其size设置为您想要图片的尺寸。