CIImage удваивает размер измененного изображения - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть следующий код на детской площадке:

import UIKit

var str = "Hello, playground"

func rescaledImage(_ image: UIImage, with newSize: CGSize) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: newSize)
    let rescaled = renderer.image { _ in
        image.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
    }

    return rescaled
}

let original = UIImage(named: "burn.jpg")!

let resized = rescaledImage(original, with: CGSize(width: 200, height: 200))

let ciImage = CIImage(image: resized)

burn.jpg - это черно-белый jpg с разрешением 5000 на 5000 пикселей.

Изображение resized имеет размер 200 на 200 пикселей. Однако ciImage составляет 400 на 400 пикселей. Фактически, независимо от того, к чему я его изменяю, ciImage всегда удваивается.

Однако, если я просто сделаю ciImage из original:

let ciImage = CIImage(image: original)

размер изображения будет 5000 на 5000 пикселей, а не удваивается.

Так, что вызывает это удвоение? Что-то в формате resized изображения должно быть причиной этого, но я не могу выделить это.

Обратите внимание, что это дублирование также происходит, если я использую UIGraphicsBeginImageContextWithOptions.

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
    image.draw(in: CGRect(origin: CGPoint.zero, size: CGSize(width: newSize.width, height: newSize.height)))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
}

1 Ответ

0 голосов
/ 02 ноября 2018

Если вы проверите масштаб ваших изображений, вы заметите, что original.scale, вероятно, равен 1, а resized.scale, вероятно, 2.

Вы можете установить масштаб рендера с помощью UIGraphicsImageRendererFormat и посмотреть, поможет ли это.

func rescaledImage(_ image: UIImage, with newSize: CGSize) -> UIImage {
    let format = UIGraphicsImageRendererFormat()
    format.scale = 1
    let renderer = UIGraphicsImageRenderer(size: newSize, format: format)
        let rescaled = renderer.image { _ in
        image.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
    }

    return rescaled
}
...