为什么 UIImageWriteToSavedPhotosAlbum 在渲染后保存了一张红色图像?

Why did UIImageWriteToSavedPhotosAlbum save a red image after rendering?

我用 GPUImage2(https://github.com/BradLarson/GPUImage2).

写了一段代码

我确认我的代码在触摸设置按钮(渲染过滤后的图像)之前成功保存了图像。

但是,我的代码在触摸设置按钮后保存了一个红色图像(相同大小,只有红色填充)。

我的应用程序。包括一个 RenderView IBOutlet 和两个 IBAction(设置按钮和保存按钮)。

这是我的完整源代码。

如何在点击设置按钮后成功保存图像?

import UIKit
import GPUImage

class ViewController: UIViewController {
  var inputUIImage = UIImage(named: "testImage.png")
  @IBOutlet weak var renderView: RenderView!
  var pictureInput: PictureInput!
  var filterColorInversion = ColorInversion()

  @IBAction func setButtonDown(_ sender: UIButton) {
     pictureInput = PictureInput(image: inputUIImage!)
     pictureInput --> filterColorInversion --> renderView
    pictureInput.processImage()
  }

  @objc func saveImageFailedCallback(_ image: UIImage, didFinishSavingWith error: NSError?, contextInfo context: UnsafeMutableRawPointer?) {
    print("\(String(describing: error))")
  }

  @IBAction func saveButtonDown(_ sender: UIButton) {
    let outputImage = inputUIImage!.filterWithOperation(filterColorInversion)
    UIImageWriteToSavedPhotosAlbum(outputImage, self, #selector(saveImageFailedCallback(_:didFinishSavingWith:contextInfo:)), nil)
  }

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

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

这表明我的代码在触摸设置按钮之前成功保存了图像(渲染过滤后的图像):

这表明我的代码在触摸设置按钮后成功呈现过滤后的图像

这表明我的代码无法在触摸设置按钮后保存过滤后的图像(但大小相同且仅填充红色):

我解决了这个问题! 我添加了一个可选的 UIImage (tempImage),用于临时保存在内存中。 当 "saveButtonDown()" 被调用时,我检查 tempImage 是否为零。 如果它是零,我只打印一条错误消息(无图像)。 如果它不是 nil,则它必须已在 "setButtonDown()" 处初始化。 这是我的完整源代码。 谢谢。

import UIKit
import GPUImage

class ViewController: UIViewController {
    var inputUIImage = UIImage(named: "testImage.png")
    @IBOutlet weak var renderView: RenderView!
    var pictureInput: PictureInput!
    var filterColorInversion = ColorInversion()

    var tempImage: UIImage?

    @IBAction func setButtonDown(_ sender: UIButton) {
        pictureInput = PictureInput(image: inputUIImage!)

        tempImage = inputUIImage!.filterWithOperation(filterColorInversion)

        pictureInput --> filterColorInversion --> renderView
        pictureInput.processImage()
    }

    @objc func saveImageFailedCallback(_ image: UIImage, didFinishSavingWith error: NSError?, contextInfo context: UnsafeMutableRawPointer?) {
        print("\(String(describing: error))")
    }

    @IBAction func saveButtonDown(_ sender: UIButton) {
        if (tempImage != nil) {
            UIImageWriteToSavedPhotosAlbum(tempImage!, self, #selector(saveImageFailedCallback(_:didFinishSavingWith:contextInfo:)), nil)
        } else {
            print("No Image")
        }
    }

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

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