MonoTouch Создание UIImage из CIImage приводит к недопустимому аргументу/неправильному селектору

Я пытаюсь создать размытый фон, когда показываю всплывающее окно, у меня почти получилось.

Я нашел некоторый Objective C, который я перевел на 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;
    }

person canderse    schedule 07.12.2012    source источник
comment
Помогите нам помочь вам :-) Было бы проще, если бы вы могли предоставить ссылку на исходный код ObjC и если бы вы могли описать, чего вы почти достигли (по сравнению с тем, что вы ожидается).   -  person poupou    schedule 07.12.2012
comment
Извините, я использовал эту статью о переполнении стека в качестве справки. stackoverflow.com/questions/11130923/apply-blur-to-uiview с уважением, Кристиан   -  person canderse    schedule 07.12.2012


Ответы (1)


Сначала убедитесь, что вы используете iOS 6 (или более позднюю версию), так как CIGaussianBlur не было доступно в iOS до этой версии.

Далее вам не хватает (из исходного кода) строки:

UIGraphicsEndImageContext();

который в С#/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+).

person poupou    schedule 07.12.2012
comment
Спасибо, работает, и я считаю, что он также должен работать на iOS 5.11, но я не проверял его. но теперь у меня это работает, накладные расходы на производительность не оправдывают эффект, который он создает. огромное спасибо - person canderse; 10.12.2012
comment
Без проблем. Пожалуйста, найдите время, чтобы отметить (серая / зеленая галочка под голосами) вопрос как ответ на него, чтобы люди, похожие на вопрос, могли быстро определить, что им доступен ответ (и добро пожаловать в stackoverflow :-) - person poupou; 10.12.2012