Xamarin.ios 在iOS中使用滑块应用图像效果(亮度)时应用程序崩溃

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

我正在使用图像视图,并基于滑块值将亮度效果应用于图像视图的图像。 滑块值的范围为-100到+100。 持续移动滑块后,应用程序将关闭。 我甚至尝试过处理上下文,但同样的问题也存在。 请参考下面的代码并帮助我解决

    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