MonoTouch 从 CIImage 创建 UIImage 会导致参数无效/选择器错误

Posted

技术标签:

【中文标题】MonoTouch 从 CIImage 创建 UIImage 会导致参数无效/选择器错误【英文标题】:MonoTouch Making a UIImage from a CIImage causes an invalid argument / bad selector 【发布时间】:2012-12-07 00:19:32 【问题描述】:

当我显示一个弹出框时,我试图创建一个模糊的背景,我几乎可以让它工作。

我找到了一些我翻译成 C# 的 Objective C。

问题出在这一行

UIImage finalImage = new UIImage(resultImage);

希望这只是我做错了什么

    private UIView CreateBlurView(UIView view)
    
        UIGraphics.BeginImageContext(view.Bounds.Size);
        view.Layer.RenderInContext(UIGraphics.GetCurrentContext());
        UIImage viewImage = UIGraphics.GetImageFromCurrentImageContext();

        // Blur Image
        CIImage imageToBlur = CIImage.FromCGImage(viewImage.CGImage);
        CIFilter gaussianBlurFilter = CIFilter.FromName("CIGaussianBlur");
        gaussianBlurFilter.SetValueForKey(imageToBlur,new NSString("inputImage"));
        gaussianBlurFilter.SetValueForKey(new NSNumber(10.0f),new NSString("inputRadius"));
        CIImage resultImage = (CIImage) gaussianBlurFilter.ValueForKey(new NSString("outputImage"));

        UIImage finalImage = new UIImage(resultImage);
        UIImageView  imageView = new UIImageView(view.Bounds);
        imageView.Image = finalImage;
        return imageView;
    

【问题讨论】:

帮助我们帮助你 :-) 如果你能提供原始 ObjC 代码的链接并且如果你能描述你几乎的内容会更容易i> 达到(与您预期的相比)。 对不起,我使用这篇堆栈溢出文章作为参考。 ***.com/questions/11130923/apply-blur-to-uiview 问候克里斯蒂安 【参考方案1】:

首先确保您使用的是 ios 6(或更高版本),因为 CIGaussianBlur 在该版本之前的 iOS 中不可用。

接下来,您缺少(从原始代码中)该行:

UIGraphicsEndImageContext();

在 C#/MonoTouch 中应该是:

MonoTouch.UIKit.UIGraphics.EndImageContext ();

你终于遇到了一个错误:(

-[UIImage initWithCIImage]: unrecognized selector sent to instance 0x168f2280

选择器末尾缺少:。现在有另一个 .ctor 接受 CIImage 以及 float(比例)和 UIImageOrientation。这个应该可以正常工作。

完整的来源是:

private UIView CreateBlurView(UIView view)

    UIGraphics.BeginImageContext(view.Bounds.Size);
    view.Layer.RenderInContext(UIGraphics.GetCurrentContext());
    UIImage viewImage = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext ();

    // Blur Image
    CIImage imageToBlur = CIImage.FromCGImage(viewImage.CGImage);
    CIFilter gaussianBlurFilter = CIFilter.FromName("CIGaussianBlur");
    gaussianBlurFilter.SetValueForKey(imageToBlur,new NSString("inputImage"));
    gaussianBlurFilter.SetValueForKey(new NSNumber(10.0f),new NSString("inputRadius"));
    CIImage resultImage = (CIImage) gaussianBlurFilter.ValueForKey(new NSString("outputImage"));

    UIImage finalImage = new UIImage(resultImage, 1.0f, UIImageOrientation.Up);
    UIImageView  imageView = new UIImageView(view.Bounds);
    imageView.Image = finalImage;

注意:MonoTouch 中的错字已修复,构造函数将在未来版本(6.0.9+)中可用

【讨论】:

感谢作品,我相信它也应该适用于 ios 5.11,但我还没有测试过。但现在我让它工作的性能开销并不能证明它产生的效果是合理的。非常感谢 没问题。请花点时间将问题标记为已回答(选票下方的灰色/绿色复选标记),以便人们可以快速确定类似问题的答案(欢迎使用 *** :-)

以上是关于MonoTouch 从 CIImage 创建 UIImage 会导致参数无效/选择器错误的主要内容,如果未能解决你的问题,请参考以下文章

从图像文件创建CIImage模式

如何将 UIImage 转换为 CIImage,反之亦然

尝试将 CIImage 与从视频文件帧获得的纹理一起使用时,CIImage 为空白

MonoTouch:从命令行创建 iOS AppStore-Version

添加专用 UI​​ViewController(例如 Monotouch 中的 UIPageViewController)的正确方法是啥?

了解自定义 UITableCellView 的创建——从 MonoTouch 中的 Nibs 加载