gpt4 book ai didi

ios - 图像亮度/对比度 - Xamarin iOS

转载 作者:行者123 更新时间:2023-12-01 18:47:31 26 4
gpt4 key购买 nike

Xamarin 提供了一些示例代码,用于在 iOS 中对图像进行简单调整:

https://github.com/xamarin/recipes/blob/master/ios/media/coreimage/adjust_contrast_and_brightness_of_an_image/color_controls_pro/ImageViewController.cs

此代码仅在用户松开 slider 旋钮时更新图像 - 而不是我们通常期望的持续更新。

但是,当我进行以下更改时,我确实会在硬件上遇到 SIGSEGV 故障。

    //sliderC.TouchUpInside += HandleValueChanged;
//sliderS.TouchUpInside += HandleValueChanged;
//sliderB.TouchUpInside += HandleValueChanged;

sliderC.ValueChanged += HandleValueChanged;
sliderS.ValueChanged += HandleValueChanged;
sliderB.ValueChanged += HandleValueChanged;

我希望这会以某种方式“重载”代码。您将如何实现避免此问题的图像调整?是否有较低级别的方法,或者其他应用程序是否只是使用图像的低分辨率版本进行调整?

最佳答案

这是我做的一个“更多”实时的快速版本(这是来自 sim 的记录,设备(6s)根据初始图像大小而平滑。

enter image description here

从模板创建一个单独的 viewcontroller iOS 应用程序,并向 Storyboard 添加一个 UIImageView 和三个 slider ,使其看起来像动画 gif。

我创建了一个简单的类来存储 ColorCtrl 值(亮度、对比度、饱和度:

public class ColorCtrl
{
public float s;
public float b;
public float c;
}

比在 ViewDidLoad方法,做一些设置:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();

string filePath = Path.Combine (NSBundle.MainBundle.BundlePath, "hero.jpg");
originalImage = new CIImage (new NSUrl (filePath, false));

colorCtrls = new CIColorControls ();
colorCtrls.Image = 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);
}

然后是三个 slider 的更改处理程序。

如果最后一次转换没有完成,我会在其中“破解”一个繁忙的标志以便跳过图像转换。如果我们不忙,则对我们的异步转换方法执行等待调用。

注意:我说的是“hack”,我的意思是,以最佳实践方式,这应该将转换请求泵入队列,队列处理程序将汇总队列中的所有待处理项目,刷新它们并进行转换。

注意:我在生成的事件处理程序中添加了“异步”,所以我可以 await图像变换。

注意:三个 slider 的处理程序除了它们分配的值外都是相同的;颜色CtrlV.b | colorCtrlV.s |颜色控制V.c

注意:您可以在用户触摸时对大图像进行下采样,对其执行转换,然后在触摸时,转换原始全尺寸图像...
async partial void brightnessChange (UISlider sender)
{
if (!busy) {
busy = true;
colorCtrlV.b = sender.Value;
this.imageView.Image = await FilterImageAsync (colorCtrlV);
busy = false;
}
}

好的,现在对于实际的转换,一个相当简单的 Run.Task 以便我们可以从主线程中完成这项工作并且不会阻塞 UI。这样,当用户滑动手指时, slider 不会卡住,但是由于 slider 处理程序中的“忙”标志/hack,我们可能会跳过其中一些事件(我们 应该 为触摸添加处理程序拖动退出,以便我们处理“最后一个”用户请求的值......)
// async Task.Run() - not best practice - just a demo
async Task<UIImage> FilterImageAsync (ColorCtrl value)
{
if (transformImage == null)
transformImage = new Func<UIImage>(() => {
colorCtrls.Brightness = colorCtrlV.b;
colorCtrls.Saturation = colorCtrlV.s;
colorCtrls.Contrast = colorCtrlV.c;
var output = colorCtrls.OutputImage;
var cgImage = context.CreateCGImage (output, originalImage.Extent);
var filteredImage = new UIImage (cgImage);
return filteredImage;
});
UIImage image = await Task.Run<UIImage>(transformImage);
return image;
}

个人 对于这种类型的实时图像转换,我更喜欢通过 OpenGL-ES 使用 GPUImage因为屏幕在 60z 刷新率下的交互就像黄油一样流畅,但它比使用 CoreImage 的工作要多得多。过滤器。

关于ios - 图像亮度/对比度 - Xamarin iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34225890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com