CIImage使调整大小的图像变大一倍

3

我在playground中有以下代码:

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是一张5000像素乘以5000像素的黑白JPG图片。

调整大小后的图片应为200像素乘以200像素。然而,ciImage的大小是400像素乘以400像素。事实上,无论我将其调整到什么尺寸,ciImage始终会加倍。

但是,如果我直接使用original来创建ciImage

let ciImage = CIImage(image: original)

ciImage将为5000x5000像素,而不是加倍。

那么是什么导致了这种加倍?对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个回答

8

如果您检查图片的比例尺,您会发现原始比例 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
}

尝试搜索了一下,但这次没有找到,你知道为什么它会改变比例吗?我遇到过类似的问题,多亏了这个答案,最终我终于明白了发生了什么:D - kolboc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接