我使用GPUImage2(https://github.com/BradLarson/GPUImage2)编写了一段代码。
我确认我的代码在触摸设置按钮之前成功保存图像(渲染过滤后的图像)。
但是,我的代码在触摸设置按钮后保存红色图像(相同尺寸,仅填充红色)。
我的应用。包括一个RenderView IBOutlet和两个IBAction(设置按钮和保存按钮)。
这是我的完整源代码。
如何在触摸设置按钮后成功保存图像?
final ActivityManager activityManager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
final List<RunningTaskInfo> recentTasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
View linearLayout = findViewById(R.id.info);
for (int i = 0; i < recentTasks.size(); i++)
{
TextView valueTV = new TextView(this);
valueTV.setText(recentTasks.get(i).baseActivity.toShortString()+ "\t\t ID:
"+recentTasks.get(i).id);
valueTV.setId(i);
valueTV.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
((LinearLayout) linearLayout).addView(valueTV);
}
它显示我的代码在触摸设置按钮之前成功保存图像(渲染过滤后的图像):
它显示我的代码在触摸设置按钮后无法保存已过滤的图像(但尺寸相同且仅填充红色):
答案 0 :(得分:0)
我解决了这个问题! 我添加了一个可选的UIImage(tempImage),用于暂时保存在内存中。 当调用“saveButtonDown()”时,我检查tempImage是否为nil。 如果它是nil,我只打印一条错误消息(No Image)。 如果它不是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()
}
}