Белая рамка вокруг измененного изображения - PullRequest
0 голосов
/ 04 апреля 2020

Я использую следующий код для изменения размера изображения. Но я продолжаю получать белую рамку внизу

 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 для округления значений. Но все же тот же вопрос.

enter image description here

1 Ответ

1 голос
/ 04 апреля 2020
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

Если вы хотите учесть масштаб экрана, просто удалите деление на (NSScreen.main?.backingScaleFactor ?? 1) из метода при расчете коэффициентов X и коэффициент Y

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...