ios - 按角度和核心图像坐标系旋转 CIImage
问题描述
我对核心图像坐标系、应用变换方式和确定范围有一些疑问。我在文档或互联网上找不到太多,所以我尝试使用以下代码来旋转 CIImage 并将其显示在 UIImageView 中。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imageView.contentMode = .scaleAspectFit
let uiImage = UIImage(contentsOfFile: imagePath)
ciImage = CIImage(cgImage: (uiImage?.cgImage)!)
imageView.image = uiImage
}
private var currentAngle = CGFloat(0)
private var ciImage:CIImage!
private var ciContext = CIContext()
@IBAction func rotateImage() {
let extent = ciImage.extent
let translate = CGAffineTransform(translationX: extent.midX, y: extent.midY)
let uiImage = UIImage(contentsOfFile: imagePath)
currentAngle = currentAngle + CGFloat.pi/10
let rotate = CGAffineTransform(rotationAngle: currentAngle)
let translateBack = CGAffineTransform(translationX: -extent.midX, y: -extent.midY)
let transform = translateBack.concatenating(rotate.concatenating(translate))
ciImage = CIImage(cgImage: (uiImage?.cgImage)!)
ciImage = ciImage.transformed(by: transform)
NSLog("Extent \(ciImage.extent), Angle \(currentAngle)")
let cgImage = ciContext.createCGImage(ciImage, from: ciImage.extent)
imageView.image = UIImage(cgImage: cgImage!)
}
因此,当我每次按下按钮旋转图像时,图像每次旋转角度pi/10。但我看到 UIImageView 中的图像缩小了。NSLogs 显示范围随着一些旋转而增长,原点 x 和 y 变为负数。
2021-09-24 14:43:29.280393+0400 CoreImagePrototypes[65817:5175194] Metal API Validation Enabled
2021-09-24 14:43:31.094877+0400 CoreImagePrototypes[65817:5175194] Extent (-105.0, -105.0, 1010.0, 1010.0), Angle 0.3141592653589793
2021-09-24 14:43:41.426371+0400 CoreImagePrototypes[65817:5175194] Extent (-159.0, -159.0, 1118.0, 1118.0), Angle 0.6283185307179586
2021-09-24 14:43:42.244703+0400 CoreImagePrototypes[65817:5175194] Extent (-159.0, -159.0, 1118.0, 1118.0), Angle 0.9424777960769379
2021-09-24 14:43:42.644446+0400 CoreImagePrototypes[65817:5175194] Extent (-105.0, -105.0, 1010.0, 1010.0), Angle 1.2566370614359172
2021-09-24 14:43:43.037312+0400 CoreImagePrototypes[65817:5175194] Extent (0.0, 0.0, 800.0, 800.0), Angle 1.5707963267948966
2021-09-24 14:43:43.478774+0400 CoreImagePrototypes[65817:5175194] Extent (-105.0, -105.0, 1010.0, 1010.0), Angle 1.8849555921538759
2021-09-24 14:43:44.045811+0400 CoreImagePrototypes[65817:5175194] Extent (-159.0, -159.0, 1118.0, 1118.0), Angle 2.199114857512855
我的问题:
我如何确定缩放因子以重新缩放图像,以使范围不与原始图像矩形相交?
负范围原点究竟是什么意思?相对于它是负的什么?我了解 Core Image 中的坐标系是相对的,假设图像的左下角为(0,0),而不是相对于 UIKit 中的某些超级视图。
解决方案
目前尚不清楚问题是什么,但您似乎关注的是extent
. 这就像框架,就像框架一样,如果你对 CIImage 应用了变换,它就会失去意义。旋转后,extent
现在基于变换图像的边界框。因此,如果您有一个水平较宽的图像并且您将它逆时针旋转一点,它extent
会变得更高并且它的顶部变成负数。
推荐阅读
- python - 为参数 io 创建变量到 pd.read_excel()
- azure-data-lake - U-SQL 动态表值函数
- c# - WPF字符串格式化列表的内容
- sql - 从 TXT/LOG 文件中获取当前日期
- apache-kafka - 如何从 kafka_2.10-0.8.1.1 中删除不一致的 kafka 主题元数据数据
- bash - 如何通过间接迭代字典
- javascript - 使用 JavaScript click 事件处理程序更改标签
- batch-file - 在 cmd.exe 中绕过 UAC
- android - Android ScrollView verticalScrollbarPosition 属性
- c++ - 在 c++11 中迭代函子元组