Xamarin.ios 在iOS中使用滑块应用图像效果(亮度)时应用程序崩溃
我正在使用图像视图,并基于滑块值将亮度效果应用于图像视图的图像。 滑块值的范围为-100到+100。 持续移动滑块后,应用程序将关闭。 我甚至尝试过处理上下文,但同样的问题也存在。 请参考下面的代码并帮助我解决Xamarin.ios 在iOS中使用滑块应用图像效果(亮度)时应用程序崩溃,xamarin.ios,image-effects,Xamarin.ios,Image Effects,我正在使用图像视图,并基于滑块值将亮度效果应用于图像视图的图像。 滑块值的范围为-100到+100。 持续移动滑块后,应用程序将关闭。 我甚至尝试过处理上下文,但同样的问题也存在。 请参考下面的代码并帮助我解决 UIImageView imageView; private float brightnessAmount; private bool isBrightnessApplied; private ImageEffect effects; privat
UIImageView imageView;
private float brightnessAmount;
private bool isBrightnessApplied;
private ImageEffect effects;
private CIContext filterContext;
UIImage originalImage;
public override void ViewDidLoad()
{
base.ViewDidLoad();
effects = ImageEffect.Brightness;
originalImage = UIImage.FromBundle("image.jpg");
var frame = this.View.Frame;
UIView mainView = new UIView();
mainView.Frame = frame;
imageView = new UIImageView();
imageView.Frame = new CGRect(frame.Left, frame.Top, frame.Width, frame.Height - 100);
imageView.Image = UIImage.FromBundle("image.jpg");
mainView.Add(imageView);
UISlider slider = new UISlider();
slider.Frame = new CGRect(frame.Left, imageView.Frame.Bottom, frame.Width, 100);
slider.MinValue = -100;
slider.MaxValue = 100;
slider.ValueChanged += Slider_ValueChanged;
mainView.Add(slider);
this.Add(mainView);
}
private void Slider_ValueChanged(object sender, EventArgs e)
{
var amount = (sender as UISlider).Value;
amount = amount > 100 ? 100 : amount < -100 ? -100 : amount;
amount = amount / 100;
CIImage currentImage = GetFilteredCIImage(effects);
CIColorControls colorCtrls = new CIColorControls() { Image = currentImage };
if (effects == ImageEffect.Brightness)
{
colorCtrls.Brightness = amount;
brightnessAmount = amount;
isBrightnessApplied = true;
}
if (filterContext == null )
filterContext = CIContext.FromOptions(null);
var outputImage = colorCtrls.OutputImage;
var result = filterContext.CreateCGImage(outputImage, outputImage.Extent);
filterContext.ClearCaches();
imageView.Image = UIImage.FromImage(result);
result.Dispose();
result = null;
outputImage.Dispose();
outputImage = null;
}
private CIImage GetFilteredCIImage(ImageEffect effect)
{
CIImage currentImage = CIImage.FromCGImage(originalImage.CGImage);
if (effect == ImageEffect.None) return currentImage;
if ( isBrightnessApplied)
{
CIColorControls colorCtrls = new CIColorControls() { Image = currentImage };
colorCtrls.Brightness = brightnessAmount;
currentImage = colorCtrls.OutputImage;
colorCtrls.Dispose();
}
return currentImage;
}
UIImageView;
私人浮动金额;
应用私有布尔;
私人影像效应;
私有CIContext筛选器Context;
UIImage原始图像;
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
效果=图像效果。亮度;
originalImage=UIImage.FromBundle(“image.jpg”);
var frame=this.View.frame;
UIView mainView=新UIView();
mainView.Frame=Frame;
imageView=新UIImageView();
imageView.Frame=新的CGRect(Frame.Left、Frame.Top、Frame.Width、Frame.Height-100);
imageView.Image=UIImage.FromBundle(“Image.jpg”);
mainView.Add(imageView);
UISlider slider=新的UISlider();
slider.Frame=新的CGRect(Frame.Left,imageView.Frame.Bottom,Frame.Width,100);
slider.MinValue=-100;
slider.MaxValue=100;
slider.ValueChanged+=slider\u ValueChanged;
mainView.Add(滑块);
添加(mainView);
}
私有无效滑块\u值已更改(对象发送方,事件参数e)
{
var amount=(发送方为UISlider).Value;
金额=金额>100?100:金额<-100?-100:金额;
金额=金额/100;
CIImage currentImage=GetFilteredCiiImage(效果);
CiColorControl colorCtrls=新的CiColorControl(){Image=currentImage};
如果(效果==图像效果.亮度)
{
颜色中心亮度=数量;
亮度金额=金额;
isBrightnessApplied=true;
}
如果(filterContext==null)
filterContext=CIContext.FromOptions(null);
var outputImage=colorCtrls.outputImage;
var result=filterContext.CreateCGImage(outputImage,outputImage.Extent);
filterContext.ClearCaches();
imageView.Image=UIImage.FromImage(结果);
result.Dispose();
结果=空;
outputImage.Dispose();
outputImage=null;
}
私有CIImage GetFilteredCIImage(ImageEffect效果)
{
CIImage currentImage=CIImage.FromCGImage(originalImage.CGImage);
if(effect==ImageEffect.None)返回currentImage;
如果(是否应用了亮度)
{
CiColorControl colorCtrls=新的CiColorControl(){Image=currentImage};
colorCtrls.亮度=亮度量;
currentImage=colorCtrls.OutputImage;
colorCtrls.Dispose();
}
返回当前图像;
}
如果要更改图像的亮度,请检查以下代码
注意:您需要在真实设备上测试它,因为它使用GPU上下文。在模拟器上,它将有一个延迟
using CoreGraphics;
using CoreImage;
using Foundation;
using System;
using UIKit;
using OpenGLES;
using System.Threading.Tasks;
namespace App10
{
public partial class ViewController : UIViewController
{
UIImageView imageView;
CIContext context;
UIImage originalImage;
CIColorControls colorCtrls;
bool isbusy;
public ViewController (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
originalImage = UIImage.FromBundle("Images.png");
var frame = this.View.Frame;
UIView mainView = new UIView();
mainView.Frame = frame;
imageView = new UIImageView();
imageView.Frame = new CGRect(frame.Left, frame.Top, frame.Width, frame.Height - 100);
imageView.Image = UIImage.FromBundle("Images.png");
mainView.Add(imageView);
UISlider slider = new UISlider();
slider.Frame = new CGRect(frame.Left, imageView.Frame.Bottom, frame.Width, 100);
slider.MinValue = -100;
slider.MaxValue = 100;
slider.ValueChanged += Slider_TouchUpInside;
mainView.Add(slider);
this.Add(mainView);
colorCtrls = new CIColorControls();
colorCtrls.InputImage = new CIImage(originalImage);
// Create the context only once, and re-use it
var contextOptions = new CIContextOptions();
contextOptions.UseSoftwareRenderer = false; // gpu vs. cpu
// On save of the image, create a new context with highqual attributes and re-apply the filter...
contextOptions.HighQualityDownsample = false;
contextOptions.PriorityRequestLow = false; // high queue order it
contextOptions.CIImageFormat = (int)CIFormat.ARGB8; // use 32bpp, vs. 64|128bpp
context = CIContext.FromOptions(contextOptions);
// Perform any additional setup after loading the view, typically from a nib.
}
private async void Slider_TouchUpInside(object sender, EventArgs e)
{
if(!isbusy)
{
isbusy = true;
var slider = sender as UISlider;
imageView.Image = await FilterImageAsync(slider.Value / 100);
isbusy = false;
}
}
async Task<UIImage> FilterImageAsync(float value)
{
var transformImage = new Func<UIImage>(() => {
colorCtrls.Brightness = value;
CIImage input = new CIImage(originalImage);
var output = colorCtrls.OutputImage;
var cgImage = context.CreateCGImage(output, input.Extent);
var filteredImage = new UIImage(cgImage);
return filteredImage;
});
UIImage image = await Task.Run<UIImage>(transformImage);
return image;
}
}
}
使用CoreGraphics;
使用CoreImage;
使用基础;
使用制度;
使用UIKit;
使用OpenGLES;
使用System.Threading.Tasks;
名称空间App10
{
公共部分类ViewController:UIViewController
{
UIImageView图像视图;
语境;
UIImage原始图像;
颜色控制色标;
布尔很忙;
公共视图控制器(IntPtr句柄):基本(句柄)
{
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
originalImage=UIImage.FromBundle(“Images.png”);
var frame=this.View.frame;
UIView mainView=新UIView();
mainView.Frame=Frame;
imageView=新UIImageView();
imageView.Frame=新的CGRect(Frame.Left、Frame.Top、Frame.Width、Frame.Height-100);
imageView.Image=UIImage.FromBundle(“Images.png”);
mainView.Add(imageView);
UISlider slider=新的UISlider();
slider.Frame=新的CGRect(Frame.Left,imageView.Frame.Bottom,Frame.Width,100);
slider.MinValue=-100;
slider.MaxValue=100;
slider.ValueChanged+=滑块内部接触;
mainView.Add(滑块);
添加(mainView);
colorCtrls=新的CiColorControl();
colorCtrls.InputImage=新的CIImage(原始图像);
//只创建一次上下文,然后重新使用它
var contextOptions=new CIContextOptions();
contextOptions.UseSoftwareRenderer=false;//gpu与cpu
//保存图像时,使用highqual属性创建一个新上下文,并重新应用过滤器。。。
contextOptions.HighQualityDownsample=false;
contextOptions.PriorityRequestLow=false;//高队列顺序
contextOptions.CIImageFormat=(int)CIFormat.ARGB8;//使用32bpp,而不是64 | 128bpp
context=CIContext.FromOptions(contextOptions);
//加载视图后,通常从nib执行任何附加设置。
}
私有异步void Slider_TouchUpInside(对象发送方,事件参数e)
{
如果(!正忙)
{
isbusy=true;
var slider=发送方作为UISlider;
imageView.Image=wait FilterImageAsync(slider.Value/100);
isbusy=false;
}
}
异步任务筛选器映像异步(浮点值)
{
var transformImage=新函数(()=>{
颜色中心亮度=数值;
CIImage输入=新的CIImage(原始图像);
var输出=colorCtrls.OutputImage;
var cgImage=context.CreateCGImage(输出,输入.E