【问题标题】:White Border around Resized Image调整大小的图像周围的白色边框
【发布时间】:2020-07-16 17:26:11
【问题描述】:

我正在使用以下代码来调整图像的大小。但我一直在底部得到一个白色边框

 func resize(withSize targetSize: NSSize) -> NSImage? {

        let size=NSSize(width: floor((targetSize.width/(NSScreen.main?.backingScaleFactor)!)), height:floor( (targetSize.height/(NSScreen.main?.backingScaleFactor)!)))

        let frame = NSRect(x: 0, y: 0, width: floor(size.width), height: floor(size.height))

        guard let representation = self.bestRepresentation(for: frame, context: nil,hints: nil) else {
            return nil
        }

        let image = NSImage(size: size, flipped: false, drawingHandler: { (_) -> Bool in
            return representation.draw(in: frame)
        })

        return image
    }

我已经尝试使用floor 函数来四舍五入值。但仍然是同样的问题。

【问题讨论】:

  • 您的代码将 scaleToFit(这会扭曲您的原始图像)。是故意的吗?
  • @LeoDabus No....我只是想调整图像大小...
  • 这也会考虑到屏幕比例。如果您传递 300x300 的大小,则屏幕比例为 @2x,生成的图像将为 600x600。是你想要的吗?
  • @LeoDabus 我通过了屏幕比例以确保图像不是 2X 缩放,因为我有一个视网膜屏幕。基本上我需要两个函数来调整图像保持纵横比的大小,一个不保留纵横比。输出文件必须与用户输入的像素大小完全相同,以防非长宽比保留。它应该与屏幕大小无关。
  • 如果不考虑屏幕比例,结果看起来会像素化

标签: swift macos cocoa swift4


【解决方案1】:
extension NSImage {
    func resize(withSize targetSize: NSSize) -> NSImage? {
        let ratioX = targetSize.width / size.width / (NSScreen.main?.backingScaleFactor ?? 1)
        let ratioY = targetSize.height / size.height / (NSScreen.main?.backingScaleFactor ?? 1)
        let ratio = ratioX < ratioY ? ratioX : ratioY
        let canvasSize = NSSize(width: size.width * ratio, height: size.height * ratio)
        let frame = NSRect(origin: .zero, size: canvasSize)
        guard let representation = bestRepresentation(for: frame, context: nil, hints: nil)
        else { return nil }
        return NSImage(size: canvasSize, flipped: false) { _ in representation.draw(in: frame) }
    }
}

let image = NSImage(contentsOf: URL(string: "http://i.stack.imgur.com/Xs4RX.jpg")!)!
let resized = image.resize(withSize: .init(width: 400, height: 300))  // w 267 h 300

如果您想考虑屏幕比例,只需在计算 ratioX 和 ratioY 时从方法中删除(NSScreen.main?.backingScaleFactor ?? 1) 的除法

【讨论】:

  • 谢谢..我刚刚关闭了我的机器。明天检查并回来。
  • 与代码无关。您的问题在其他地方
  • 我认为问题就在这里......我正在尝试根据您的旧答案codeshare.io/G7Kzy1来检测和裁剪方形面孔@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2017-10-28
  • 2010-12-24
  • 2023-03-07
  • 2019-09-01
  • 1970-01-01
相关资源
最近更新 更多