📜  cifilter 图像保留方向 - Swift (1)

📅  最后修改于: 2023-12-03 14:40:05.561000             🧑  作者: Mango

CIFilter 图像保留方向 - Swift

在 iOS 应用中,我们常常需要根据拍摄设备的方向对图片进行旋转或翻转等处理。Core Image 框架提供了 CIFilter 类,其中可用的 CIAffineTransform 滤镜可实现对图像的旋转、缩放、平移和翻转等变换操作。

在这篇文章中,我们将使用 CIFilter 框架中的 CIAffineTransform 滤镜来保持图片的方向不变。

准备工作

在 Xcode 中,创建一个新的单视图应用程序项目。在 ViewController.swift 文件中,我们将使用 UIImagePickerController 来获取设备中的照片,并将其传递给 UIImageView 进行显示。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!

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

    @IBAction func pickImage(_ sender: Any) {
        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        pickerController.sourceType = .photoLibrary
        present(pickerController, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.contentMode = .scaleAspectFit
            imageView.image = image
        }
        dismiss(animated: true, completion: nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }

}

在这个视图中,我们添加了一个 UIImageView 和一个 UIButton。点击按钮后,将调用 UIImagePickerController,从照片库中选择并显示一张图片。

保持图片方向不变

保持图片方向不变

当我们从摄影设备获取照片时,设备可能会在图像中添加一个方向属性。这个方向属性表示设备的方向,以便正确地显示图像。

但是,如果我们将此照片传递给一个只能处理正常方向图像的函数时,就可能会出现问题。因此,我们必须对这些照片进行旋转或翻转等操作,以便在正确的方向上显示它们。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        // 修正图像的方向
        if let fixedImage = fixImageOrientation(image: image) {
            imageView.contentMode = .scaleAspectFit
            imageView.image = fixedImage
        }
    }
    dismiss(animated: true, completion: nil)
}

func fixImageOrientation(image: UIImage) -> UIImage? {
    if (image.imageOrientation == .up) {
        // 如果图像的方向是向上的,则保持不变
        return image
    }

    // 建立一个 Core Image 上下文
    let context = CIContext(options: nil)
    // 创建一个 Core Image 图像
    let ciImage = CIImage(cgImage: image.cgImage!)

    var transform: CGAffineTransform

    switch image.imageOrientation {
    case .down, .downMirrored:
        // 如果图像的方向为下方,则需要将其旋转180度
        transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
    case .left, .leftMirrored:
        // 如果图像的方向为左边,则需要将其旋转90度
        transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
    case .right, .rightMirrored:
        // 如果图像的方向为右边,则需要将其旋转270度
        transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi / 2))
    default:
        transform = CGAffineTransform.identity
    }

    switch image.imageOrientation {
    case .upMirrored, .downMirrored:
        // 如果图像水平翻转,则需要进行垂直翻转
        transform = transform.scaledBy(x: -1, y: 1)
    default:
        transform = transform.scaledBy(x: 1, y: -1)
    }

    // 对图像进行变换
    let transformedImage = ciImage.transformed(by: transform)
    // 从 Core Image 上下文中获取 CGImage
    let cgImage = context.createCGImage(transformedImage, from: transformedImage.extent)!
    // 返回修正后的 UIImage
    return UIImage(cgImage: cgImage)
}

在这里,我们定义了一个 fixImageOrientation 函数,它接受一个 UIImage 对象并返回修正后的 UIImage

首先,我们检查图像的方向是否为 “向上”。如果是,则不做任何修改并返回原始图像。否则,我们使用 CIContext 创建了一个 Core Image 上下文,并将 UIImage 转换为 CIImage

接下来,我们根据图像的方向计算出将要应用的变换。我们将应用的变换保存在 transform 变量中,并将其传递给 CIImagetransformed 方法。这将把我们的图像应用于变形,最终生成一个 "fixedImage"。

最后,我们使用修正后的 UIImage 对象更新 UIImageView 的内容。此时,图像的方向已被正确地修正并在正确方向上显示。

结论

在本文中,我们了解了如何使用 Core Image 框架中的 CIFilter,尤其是 CIAffineTransform 滤镜来保持图像的方向不变。

我们通过 UIImagePickerController 从照片库中获取图片,并使用我们编写的 fixImageOrientation 函数修正图像的方向,以便正确显示。最后,我们将修正后的图像传递给 UIImageView 并显示它。

在实际开发中,我们可能需要对图像进行更多的处理。Core Image 框架提供了许多其他常用的滤镜,可用于应用不同的效果。我们可以根据需要使用这些滤镜来制作美观的图像效果。