ios - CIImage 将调整大小的图像的大小加倍
问题描述
我在操场上有以下代码:
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 x 5000 像素的黑白 jpg。
resized
图像正确为 200 像素 x 200 像素。但是,它ciImage
是 400 像素 x 400 像素。事实上,无论我调整它的大小,ciImage
总是加倍。
但是,如果我只是做ciImage
出来original
:
let ciImage = CIImage(image: original)
ciImage 将是 5000 x 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
}
解决方案
如果您检查图像的比例,您会注意到 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
}
推荐阅读
- php - 从数据库特定列中的数据库行条目创建数组并用于 foreach 循环
- python - 填充numpy数组的向量方式
- graphql - 如何使用特定上下文查询 Apollo GraphQL 服务器?
- c++ - 模块:AHBot(没有用于初始化“WorldSession”的匹配构造函数)
- c# - 我们可以在 asp.net 3.5 网站中全局设置 ScriptManager 控件的默认属性值吗?
- css - 选择框选项仅在 chrome 中获取滚动条
- php - URL 中的变量
- testing - VBA 抓取 div 元素
- django - 空块不适用于循环内的 endif
- excel - 如何在vba中将文本动态设置为texbox?