MonoTouch конвертировать цвета UIImage с альфа в оттенки серого и размытия? - PullRequest
9 голосов
/ 20 декабря 2011

Я пытаюсь найти рецепт для получения размытого оттенка серого 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;
}

Ответы [ 2 ]

13 голосов
/ 20 декабря 2011

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

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

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

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

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

UPDATE

Ниже приведен построчный перевод C # вашего примера. Кажется, это работает для меня (и это намного проще для моих глаз, чем 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);
        }
    }
0 голосов
/ 18 февраля 2014

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

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

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

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