簡體   English   中英

MonoTouch從CIImage制作UIImage會導致無效的參數/錯誤的選擇器

[英]MonoTouch Making a UIImage from a CIImage causes an invalid argument / bad selector

我正在嘗試創建一個模糊的背景,當我顯示一個popover我幾乎讓它工作。

我發現了一些我翻譯成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;
    }

首先要確保你使用的是iOS 6(或更高版本),因為在該版本之前,iOS中沒有CIGaussianBlur

接下來,您缺少(從原始代碼中)該行:

UIGraphicsEndImageContext();

在C#/ MonoTouch中應該是:

MonoTouch.UIKit.UIGraphics.EndImageContext ();

最后你遇到了一個bug :(

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

a :在選擇器的末尾缺少。 現在有另一個.ctor接受CIImage以及float (scale)和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+)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM