MonoTouch конвертировать цвет UIImage с альфой в оттенки серого и размытие?

Я пытаюсь найти рецепт для получения размытого оттенка серого UIImage из цветного PNG и альфа. В ObjC есть рецепты, но MonoTouch не связывает функции CGRect, поэтому не уверен, как это сделать. Любые идеи?

Вот пример ObjC оттенков серого:

(UIImage *)convertImageToGrayScale:(UIImage *)image
{
  // Create image rectangle with current image width/height
  CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);

  // Grayscale color space
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

  // Create bitmap content with current image size and grayscale colorspace
  CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0,   colorSpace, kCGImageAlphaNone);

  // Draw image into current context, with specified rectangle
  // using previously defined context (with grayscale colorspace)
  CGContextDrawImage(context, imageRect, [image CGImage]);

  // Create bitmap image info from pixel data in current context
  CGImageRef imageRef = CGBitmapContextCreateImage(context);

  // Create a new UIImage object  
  UIImage *newImage = [UIImage imageWithCGImage:imageRef];

  // Release colorspace, context and bitmap information
  CGColorSpaceRelease(colorSpace);
  CGContextRelease(context);
  CFRelease(imageRef);

  // Return the new grayscale image
  return newImage;
}

Ответ 1

Monotouch не связывает функции CGRect, поэтому не уверен, как это сделать.

При использовании MonoTouch CGRect отображается на RectangleF. Существует множество методов расширения, которые должны отображаться для каждой функции, предоставляемой GCRect. У вас не должно возникнуть проблем с переносом кода ObjectiveC с помощью них.

Если что-то не хватает, пожалуйста, заполните отчет об ошибке @http://bugzilla.xamarin.com, и мы исправим его как можно скорее (и предоставим обходное решение, когда это возможно).

В ObjC есть рецепты, но MonoTouch

Если у вас есть ссылки, пожалуйста, отредактируйте свой вопрос и добавьте их. Это облегчит вам помощь:)

UPDATE

Здесь a, строка за строкой, перевод С# вашего примера. Кажется, это работает для меня (и это намного проще для моих глаз, чем Objective-C; -)

    UIImage ConvertToGrayScale (UIImage image)
    {
        RectangleF imageRect = new RectangleF (PointF.Empty, image.Size);
        using (var colorSpace = CGColorSpace.CreateDeviceGray ())
        using (var context = new CGBitmapContext (IntPtr.Zero, (int) imageRect.Width, (int) imageRect.Height, 8, 0, colorSpace, CGImageAlphaInfo.None)) {
            context.DrawImage (imageRect, image.CGImage);
            using (var imageRef = context.ToImage ())
                return new UIImage (imageRef);
        }
    }

Ответ 2

Я написал собственный порт размытия и оттенков категорий UIImage из WWDC для Monotouch.

Пример кода для оттенка и размытия:

UIColor tintColor = UIColor.FromWhiteAlpha (0.11f, 0.73f);

UIImage yourImage;
yourImage.ApplyBlur (20f /*blurRadius*/, tintColor, 1.8f /*deltaSaturationFactor*/, null);