为啥 UIImageWriteToSavedPhotosAlbum 渲染后会保存红色图像?

Posted

技术标签:

【中文标题】为啥 UIImageWriteToSavedPhotosAlbum 渲染后会保存红色图像?【英文标题】:Why did UIImageWriteToSavedPhotosAlbum save a red image after rendering?为什么 UIImageWriteToSavedPhotosAlbum 渲染后会保存红色图像? 【发布时间】:2018-01-01 07:23:51 【问题描述】:

我使用 GPUImage2(https://github.com/BradLarson/GPUImage2) 编写了一个代码。

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

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

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

这是我的完整源代码。

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

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()
  

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

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

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

【问题讨论】:

【参考方案1】:

我解决了这个问题! 我添加了一个可选的 UIImage (tempImage),用于临时保存在内存中。 当调用“saveButtonDown()”时,我检查 tempImage 是否为 nil。 如果它为零,我只打印一条错误消息(无图像)。 如果它不是 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()
    

【讨论】:

以上是关于为啥 UIImageWriteToSavedPhotosAlbum 渲染后会保存红色图像?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?