Рисование растровых и векторных изображений

Независимо от того, создаете ли вы веб-сайт, настольное или мобильное приложение, возможность манипулировать изображениями и рисовать на них является решающим аспектом при обработке и редактировании изображений. Чтобы предоставить разработчикам расширенные, но простые в реализации функции рисования, мы представляем Aspose.Imaging.Drawing, мощный API, разработанный для приложений C# .NET и предлагающий ряд функций рисования изображений.

Библиотека чертежей C# .NET

Aspose.Imaging.Drawing — это надежный API, который позволяет обрабатывать растровые и векторные изображения с помощью передовых методов обработки изображений. Благодаря встроенному доступу к байтам API обеспечивает высокую скорость обработки при создании изображений или манипулировании ими. Используя API, вы можете рисовать объекты, манипулируя пикселями и графическими путями, а также конвертировать изображения из одного формата в другой. Aspose.Imaging.Drawing использует Aspose.Drawing в качестве графического движка по умолчанию, который представляет собой кроссплатформенную библиотеку 2D-графики, предлагающую полный набор функций для рисования текста, геометрии и изображений без каких-либо внешних зависимостей.

Вы можете загрузить и установить Aspose.Imaging.Drawing с сайта NuGet.

PM> NuGet\Install-Package Aspose.Imaging.Drawing

Давайте теперь рассмотрим некоторые существенные особенности этого API рисования .NET и их использование с помощью исходного кода.

Создание графики с использованием библиотеки рисования .NET

Aspose.Imaging.Drawing позволяет создавать изображения, рисуя различные объекты, такие как круги, линии, треугольники, квадраты и эллипсы. С помощью API вы можете создавать не только растровые изображения, но и векторные изображения. Давайте посмотрим, как рисовать растровые и векторные изображения на C# с помощью этого API рисования .NET.

Нарисовать растровое изображение

Ниже приведены шаги по рисованию растрового изображения с использованием API Aspose.Imaging.Drawing.

  • Сначала создайте изображение нужного формата с помощью метода Image.Create().
  • Затем создайте объект класса Graphics и инициализируйте его изображением, которое мы создали выше.
  • Очистите поверхность изображения с помощью метода Graphics.Clear.
  • Создайте новое перо и инициализируйте его нужным цветом.
  • Нарисуйте эллипс (или любой другой графический объект) с помощью метода Graphics.DrawEllipse().
  • Нарисуйте многоугольник, используя метод Graphics.FillPolygon().
  • Наконец, сохраните изображение, используя метод Image.Save().

В следующем фрагменте кода показано, как нарисовать изображение на C#.

string outputFolder = @"Output\";

// Создайте экземпляр BmpOptions и установите его различные свойства.
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// Создайте экземпляр FileCreateSource и назначьте его свойству Source. 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

using (var image = Image.Create(imageOptions, 500, 500))
{
    var graphics = new Graphics(image);

    // Очистите поверхность изображения белым цветом и создайте и инициализируйте объект Pen синим цветом.
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // Нарисуйте эллипс, определив ограничивающий прямоугольник шириной 150 и высотой 100. Также нарисуйте многоугольник, используя LinearGradientBrush.
    graphics.DrawEllipse(pen, new Rectangle(10, 10, 150, 100));

    using (var linearGradientBrush = new LinearGradientBrush(image.Bounds, Color.Red, Color.White, 45f))
    {
        graphics.FillPolygon(linearGradientBrush, new[] { new Point(200, 200), new Point(400, 200), new Point(250, 350) });
    }

    // Сохранить изображение
    image.Save();
}

Нарисовать векторное изображение

Подобно растровым изображениям, вы можете нарисовать векторную графику, например SVG, за несколько простых шагов. Давайте создадим векторное изображение, используя нашу библиотеку рисования C#.

  • Сначала создайте объект MemoryStream.
  • Затем загрузите изображение SVG.
  • Растеризуйте SVG в PNG и запишите результат в поток.
  • Загрузите изображение PNG из потока для дальнейшего рисования.
  • Нарисуйте изображение PNG на существующем изображении SVG.
  • Наконец, сохраните результаты.

В следующем фрагменте кода показано, как нарисовать векторное изображение на C#.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // Сначала растеризуйте Svg в Png и запишите результат в поток.
    using (SvgImage svgImage = (SvgImage)Image.Load(templatesFolder + "template.svg"))
    {
        SvgRasterizationOptions rasterizationOptions = new SvgRasterizationOptions();
        rasterizationOptions.PageSize = svgImage.Size;

        PngOptions saveOptions = new PngOptions();
        saveOptions.VectorRasterizationOptions = rasterizationOptions;

        svgImage.Save(drawnImageStream, saveOptions);

        // Теперь загрузите изображение PNG из потока для дальнейшего рисования.
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // Рисование существующего изображения SVG.
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // Уменьшите все нарисованное изображение в 2 раза и нарисуйте его в центре поверхности рисования.
            int width = imageToDraw.Width / 2;
            int height = imageToDraw.Height / 2;
            Point origin = new Point((svgImage.Width - width) / 2, (svgImage.Height - height) / 2);
            Size size = new Size(width, height);

            graphics.DrawImage(imageToDraw, origin, size);

            // Сохраните полученное изображение
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

Применить маскирование к изображениям

Маскирование при редактировании изображений — это метод выборочного сокрытия или раскрытия определенных частей изображения. Он включает в себя создание маски, которая по сути представляет собой изображение в оттенках серого, определяющее прозрачность или непрозрачность каждого пикселя исходного изображения. Маскирование изображений широко практикуется для распознавания и диагностики.

Aspose.Image.Drawing предоставляет два метода применения маскировки изображения:

  • Ручное маскирование. В качестве маски используется набор ROI. ROI для каждого среза используются для определения маски. Требуется дополнительный ввод пользователя.
  • Автоматическое маскирование. Оно не требует от пользователя большого количества входных данных, но может быть не таким точным.

Давайте теперь посмотрим, как применять ручное и автоматическое маскирование изображений в коде C#.

Ручное маскирование изображения

В следующем фрагменте кода показано, как вручную применить маскирование к изображению в C#.

string outputFolder = @"Output\";

// Исходный файл
string sourceFileName = outputFolder + "couple.png";

// Создать графический путь
GraphicsPath manualMask = new GraphicsPath();

// Добавить фигуры
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// Добавить фигуру
manualMask.AddFigure(firstFigure);

GraphicsPath subPath = new GraphicsPath();
Figure secondFigure = new Figure();
secondFigure.AddShape(
    new PolygonShape(
     new PointF[]
     {
        new PointF(310, 100), new PointF(350, 200), new PointF(250, 200)

     }, true));

secondFigure.AddShape(new PieShape(new RectangleF(10, 10, 80, 80), 30, 120));
subPath.AddFigure(secondFigure);
manualMask.AddPath(subPath);

// Применить маскировку
using (RasterImage image = (RasterImage)Image.Load(sourceFileName))
{
    MaskingOptions maskingOptions = new MaskingOptions()
    {
        Method = SegmentationMethod.Manual,
        Args = new ManualMaskingArgs
        {
            Mask = manualMask
        },
        Decompose = false,
        ExportOptions =
      new PngOptions()
      {
          ColorType = PngColorType.TruecolorWithAlpha,
          Source = new StreamSource(new MemoryStream())
      },
    };
    MaskingResult results = new ImageMasking(image).Decompose(maskingOptions);
    // Сохранение окончательного результата маскировки.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

Автоматическое маскирование изображения

В приведенном ниже фрагменте кода применяется автоматическое маскирование изображения с использованием API рисования .NET.

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // Чтобы использовать Graph Cut с автоматически рассчитанными штрихами, используется AutoMaskingGraphCutOptions.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // Указывает на то, что во время декомпозиции изображения следует выполнить новый расчет штрихов по умолчанию.
        CalculateDefaultStrokes = true,
        
        // Установка радиуса растушевки постобработки в зависимости от размера изображения.
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
            new PngOptions()
            {
                ColorType = PngColorType.TruecolorWithAlpha,
                Source = new FileCreateSource(outputFolder + "auto_masking.png")
            },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "auto_masking_2.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

Применить фильтры к изображениям

Применение фильтров к изображениям служит различным целям, и люди используют их по разным причинам, как практическим, так и художественным. Наиболее распространенные варианты использования фильтров изображений включают коррекцию цвета, улучшение качества изображения, применение специальных эффектов, подавление шума и т. д. Aspose.Imaging.Drawing поддерживает несколько типов фильтров, которые вы можете применять к изображениям, такие как медианный фильтр, фильтр движения, фильтр Гаусса и т. д.

Для демонстрации взгляните на следующий код, который применяет медианный фильтр к изображению с помощью Aspose.Imaging.Drawing.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// Загрузите шумное изображение 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // Вставьте изображение в RasterImage.
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // Создайте экземпляр класса MedianFilterOptions и задайте размер, примените фильтр MedianFilterOptions к объекту RasterImage и сохраните полученное изображение.
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // Сохранить изображение
    image.Save(outputFolder + "median_filter.gif");
}

Обрезка, поворот и изменение размера изображений

Обрезка, поворот и изменение размера изображений считаются важными функциями приложений для редактирования изображений. Это наиболее распространенные операции обработки изображений, которые используются для манипулирования цифровыми изображениями. Давайте посмотрим, как обрезать, вращать и изменять размер изображений с помощью API Aspose.Imaging.Drawing.

Обрезать изображение

Чтобы обрезать изображение, вам необходимо указать значения смещения для всех четырех сторон изображения. На основании этих значений границы изображения смещаются к центру изображения. Следующий фрагмент кода C# обрезает изображение на основе предоставленных значений сдвига.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// Загрузите существующее изображение в экземпляр класса RasterImage.
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // Перед обрезкой изображение следует кэшировать для повышения производительности.
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // Определите значения смещения для всех четырех сторон
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // На основе значений смещения примените обрезку к изображению. Метод обрезки сместит границы изображения к центру изображения и сохранит результаты на диск.
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // Сохранить обрезанное изображение
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

Поворот изображения

Чтобы повернуть изображение, Aspose.Imaging.Drawing предоставляет метод RotateFlip, который не только поворачивает изображение, но и переворачивает его (при необходимости). Вы можете выбрать желаемый вариант поворота и переворачивания из перечисления RotateFlipType. В следующем фрагменте кода показано, как повернуть изображение, но не перевернуть его в C#.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// Загрузка и поворот изображения
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // Поворот изображения
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // Сохранить изображение
    image.Save(outputFolder + "rotated_image.jpg");
}

Изменение размера изображения

Изменить размер изображения с помощью Aspose.Imaging.Drawing проще простого. Просто вызовите метод Resize и передайте новые значения высоты и ширины. В следующем фрагменте кода показано, как изменить размер изображения в C#.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // Изменить размер изображения
    image.Resize(300, 300);

    // Сохранить изображение
    image.Save(outputFolder + "resized_image.jpg");
}   

Конвертируйте изображения в другие форматы

Чтобы преобразовать изображение с помощью API Aspose.Imaging.Drawing, вам нужно всего лишь загрузить изображение и сохранить его в нужном выходном формате. Следующий фрагмент кода преобразует изображение JPG в форматы WebP, PSD, PDF и TIFF.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // Сохраняйте в разных форматах изображений
    img.Save(outputFolder + "output.webp", new Aspose.Imaging.ImageOptions.WebPOptions());
    img.Save(outputFolder + "output.psd ", new Aspose.Imaging.ImageOptions.PsdOptions());
    img.Save(outputFolder + "output.tiff", new Aspose.Imaging.ImageOptions.TiffOptions(TiffExpectedFormat.Default));

    // Сохранить как PDF
    PdfOptions exportOptions = new PdfOptions();
    exportOptions.PdfDocumentInfo = new Aspose.Imaging.FileFormats.Pdf.PdfDocumentInfo();
    img.Save(outputFolder + "output.pdf", exportOptions);
}

Получите бесплатную лицензию API

Если вы хотите оценить Aspose.Imaging.Drawing API, вы можете получить бесплатную временную лицензию, которая позволит вам использовать API на полную мощность без каких-либо ограничений.

Заключение

В области обработки графики и изображений API Aspose.Imaging.Drawing выделяется как универсальный и мощный инструмент для разработчиков C# .NET. Если вы хотите улучшить визуальные элементы, исправить искажения изображения или преобразовать изображения между форматами, этот API предоставляет полный набор функций. С помощью Aspose.Imaging.Drawing манипулирование изображениями становится у вас под рукой, позволяя создавать привлекательную и визуально потрясающую графику программными средствами.

Дайте нам знать о ваших отзывах или вопросах на нашем форуме.