【问题标题】:CIFilter returns incorrectly positioned CIImageCIFilter 返回错误定位的 CIImage
【发布时间】:2021-09-10 03:44:33
【问题描述】:

我正在使用 CIFilter 来旋转图像。它正在正确旋转。但是,当我设置 imageView.image = result 时,图像不适合 imageView 而是流到外面。这很奇怪,因为如果我使用 UIGraphicsImageRenderer 渲染图像,一切都很好。

我分享示例图像和可重现的代码;

import UIKit

class ViewController: UIViewController {

@IBOutlet private weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    openPhotoLibrary()
}

func openPhotoLibrary() {
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    imagePickerController.sourceType = UIImagePickerController.SourceType.photoLibrary
    imagePickerController.allowsEditing = false
    self.present(imagePickerController, animated: true, completion: nil)
 }
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    self.dismiss(animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    let image = info[UIImagePickerController.InfoKey(rawValue: UIImagePickerController.InfoKey.originalImage.rawValue)] as? UIImage
    
    dismiss(animated: true, completion: { [weak self] in
        
        let filter = CIFilter(name: "CIPerspectiveRotate")
        
        // let's say I want to rotate it by 50 degrees
        let radian: CGFloat = CGFloat(Double.pi) / (180 / 50)
        filter?.setValue(radian, forKey: "inputRoll")
       
        if let img = image, var image = CIImage(image: img) {
            
            let cgOrientation = img.imageOrientation.cgImagePropertyOrientation
            image = image.oriented(forExifOrientation: Int32(cgOrientation.rawValue))
            
            filter?.setValue(image, forKey: "inputImage")
            
            if let skewed = filter?.outputImage {
                let image = UIImage(ciImage: skewed)
                self?.imageView.image = image
                self?.imageView.contentMode = .scaleAspectFit
            }
        }
    })
  }
 }

白色边框是imageView的边框颜色。

【问题讨论】:

    标签: swift core-image cifilter ciimage


    【解决方案1】:

    我找到了导致这个问题的原因。

    这是从输出中获取 UIImage 的错误方法;

    let image = UIImage(ciImage: skewed)
    

    相反,我应该以这种方式获取 UIImage;

    UIImage(cgImage: CIContext(options: nil).createCGImage(skewed, from: skewed.extent)!)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2014-01-13
      • 1970-01-01
      • 2012-03-09
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多