为什么 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()
}
}
我用 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()
}
}