Основной образ в Xamarin.iOS

Основной образ — это новая платформа, представленная в iOS 5, для обеспечения обработки изображений и улучшения видеотрансляций. В этой статье представлены эти функции с примерами Xamarin.iOS.

Core Image — это новая платформа, представленная в iOS 5, которая предоставляет ряд встроенных фильтров и эффектов для применения к изображениям и видео, включая обнаружение лиц.

В этом документе содержатся простые примеры:

  • Обнаружение лиц.
  • Применение фильтров к изображению
  • Перечисление доступных фильтров.

Эти примеры помогут вам приступить к включению функций Core Image в приложения Xamarin.iOS.

Требования

Необходимо использовать последнюю версию Xcode.

Обнаружение лиц

Функция обнаружения лиц Core Image делает только то, что он говорит: он пытается определить лица на фото и возвращает координаты любых лиц, которые он распознает. Эти сведения можно использовать для подсчета количества людей в изображении, рисования индикаторов на изображении (например, для "тегов" людей в фотографии), или что-либо другое, о чем вы можете подумать.

Этот код из CoreImage\SampleCode.cs демонстрирует создание и использование обнаружения лиц на внедренном изображении:

var image = new UIImage("photoFace.JPG");
var context = CIContext.FromOptions(null);
var detector = CIDetector.CreateFaceDetector (context, true);
var ciImage = CIImage.FromCGImage(image.CGImage);
CIFeature[] features = detector.FeaturesInImage(ciImage);

Массив функций будет заполнен CIFaceFeature объектами (если обнаружены лица). CIFaceFeature Существует для каждого лица. CIFaceFeature имеет следующие свойства:

  • HasMouthPosition — обнаружен ли рот для этого лица.
  • HasLeftEyePosition — обнаружен ли левый глаз для этого лица.
  • HasRightEyePosition — был ли обнаружен правильный глаз для этого лица.
  • РотПозиция — координаты рта для этого лица.
  • LeftEyePosition — координаты левого глаза для этого лица.
  • RightEyePosition — координаты правого глаза для этого лица.

Координаты для всех этих свойств имеют свое происхождение в левом нижнем углу , в отличие от UIKit, который использует верхний левый в качестве источника. При использовании координат CIFaceFeature обязательно перевернуть их. Это очень простое пользовательское представление изображения в CoreImage\CoreImageViewController.cs демонстрирует, как нарисовать треугольники индикатора лица на изображении (обратите внимание на FlipForBottomOrigin метод):

public class FaceDetectImageView : UIView
{
    public Xamarin.iOS.CoreImage.CIFeature[] Features;
    public UIImage Image;
    public FaceDetectImageView (RectangleF rect) : base(rect) {}
    CGPath path;
    public override void Draw (RectangleF rect) {
        base.Draw (rect);
        if (Image != null)
            Image.Draw(rect);

        using (var context = UIGraphics.GetCurrentContext()) {
            context.SetLineWidth(4);
            UIColor.Red.SetStroke ();
            UIColor.Clear.SetFill ();
            if (Features != null) {
                foreach (var feature in Features) { // for each face
                    var facefeature = (CIFaceFeature)feature;
                    path = new CGPath ();
                    path.AddLines(new PointF[]{ // assumes all 3 features found
                        FlipForBottomOrigin(facefeature.LeftEyePosition, 200),
                        FlipForBottomOrigin(facefeature.RightEyePosition, 200),
                        FlipForBottomOrigin(facefeature.MouthPosition, 200)
                    });
                    path.CloseSubpath();
                    context.AddPath(path);
                    context.DrawPath(CGPathDrawingMode.FillStroke);
                }
            }
        }
    }
    /// <summary>
    /// Face recognition coordinates have their origin in the bottom-left
    /// but we are drawing with the origin in the top-left, so "flip" the point
    /// </summary>
    PointF FlipForBottomOrigin (PointF point, int height)
    {
        return new PointF(point.X, height - point.Y);
    }
}

Затем в файле SampleCode.cs изображение и компоненты назначаются перед перезаписи образа:

faceView.Image = image;
faceView.Features = features;
faceView.SetNeedsDisplay();

На снимке экрана показан пример выходных данных: расположения обнаруженных признаков лица отображаются в UITextView и рисуются на исходном изображении с помощью CoreGraphics.

Из-за того, как распознавание лиц работает, он иногда обнаруживает вещи помимо человеческих лиц (как эти томи обезьяны!).

Фильтры

Существует более 50 различных встроенных фильтров, и платформа расширяема, чтобы новые фильтры могли быть реализованы.

Применение фильтров

Применение фильтра к изображению состоит из четырех различных шагов: загрузка изображения, создание фильтра, применение фильтра и сохранение (или отображение) результата.

Сначала загрузите изображение в CIImage объект.

var uiimage = UIImage.FromFile ("photo.JPG");
var ciimage = new CIImage (uiimage);

Во-вторых, создайте класс фильтра и задайте его свойства.

var sepia = new CISepiaTone();
sepia.Image = ciimage;
sepia.Intensity = 0.8f;

В-третьих, получите доступ к свойству OutputImage и вызовите CreateCGImage метод для отрисовки окончательного результата.

CIImage output = sepia.OutputImage;
var context = CIContext.FromOptions(null);
var cgimage = context.CreateCGImage (output, output.Extent);

Наконец, назначьте изображение представлению, чтобы увидеть результат. В реальном приложении полученный образ может быть сохранен в файловой системе, фотоальбоме, твите или электронной почте.

var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;

На этих снимках экрана показаны результаты CISepia и CIHueAdjust фильтры, которые демонстрируются в примере кода CoreImage.zip.

Пример фильтра см. в разделе "Изменить контракт и яркость" рецептаCIColorControls изображения.

var uiimage = UIImage.FromFile("photo.JPG");
var ciimage = new CIImage(uiimage);
var hueAdjust = new CIHueAdjust();   // first filter
hueAdjust.Image = ciimage;
hueAdjust.Angle = 2.094f;
var sepia = new CISepiaTone();       // second filter
sepia.Image = hueAdjust.OutputImage; // output from last filter, input to this one
sepia.Intensity = 0.3f;
CIFilter color = new CIColorControls() { // third filter
    Saturation = 2,
    Brightness = 1,
    Contrast = 3,
    Image = sepia.OutputImage    // output from last filter, input to this one
};
var output = color.OutputImage;
var context = CIContext.FromOptions(null);
// ONLY when CreateCGImage is called do all the effects get rendered
var cgimage = context.CreateCGImage (output, output.Extent);
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;
var context = CIContext.FromOptions (null);
var context = CIContext.FromOptions(new CIContextOptions() {
    UseSoftwareRenderer = true  // CPU
});
var cgimage = context.CreateCGImage (output, output.Extent);
var ui = UIImage.FromImage (cgimage);
imgview.Image = ui;

Перечисление фильтров и их свойств

Этот код из CoreImage\SampleCode.cs выводит полный список встроенных фильтров и их параметров.

var filters = CIFilter.FilterNamesInCategories(new string[0]);
foreach (var filter in filters){
   display.Text += filter +"\n";
   var f = CIFilter.FromName (filter);
   foreach (var key in f.InputKeys){
     var attributes = (NSDictionary)f.Attributes[new NSString(key)];
     var attributeClass = attributes[new NSString("CIAttributeClass")];
     display.Text += "   " + key;
     display.Text += "   " + attributeClass + "\n";
   }
}

Справочник по классу CIFilter описывает встроенные фильтры и их свойства. Используя приведенный выше код, можно запросить классы фильтров, включая значения по умолчанию для параметров и максимальные и минимальные допустимые значения (которые можно использовать для проверки входных данных перед применением фильтра).

Выходные данные "Категории списка" выглядят следующим образом на симуляторе: можно прокрутить список, чтобы просмотреть все фильтры и их параметры.

Выходные данные

Каждый указанный фильтр предоставляется в виде класса в Xamarin.iOS, поэтому вы также можете изучить API Xamarin.iOS.CoreImage в браузере сборок или с помощью автоматического завершения в Visual Studio для Mac или Visual Studio.

Итоги

В этой статье показано, как использовать некоторые из новых функций платформы образов iOS 5 Core, таких как обнаружение лиц и применение фильтров к изображению. В платформе доступны десятки различных фильтров изображений.