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);