Малювати растрові та векторні зображення

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

Бібліотека малюнків C# .NET

Aspose.Imaging.Drawing — це надійний API, який дозволяє обробляти растрові та векторні зображення за допомогою вдосконалених методів обробки зображень. Завдяки власному доступу до байтів API забезпечує високу швидкість обробки під час створення та обробки зображень. Використовуючи API, ви можете малювати об’єкти за допомогою піксельних маніпуляцій і контурів графіки та конвертувати зображення з одного формату в інший. Aspose.Imaging.Drawing використовує Aspose.Drawing як графічний механізм за замовчуванням, який є міжплатформною бібліотекою двовимірної графіки, яка пропонує повний набір функцій для малювання тексту, геометрії та зображень без будь-яких зовнішніх залежностей.

Ви можете завантажити та встановити Aspose.Imaging.Drawing з NuGet.

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

Давайте тепер розглянемо деякі основні функції цього .NET Drawing API та їх використання за допомогою вихідного коду.

Створення графіки за допомогою бібліотеки малюнків .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 для кожного зрізу використовуються для визначення маски. Це потребує додаткового введення користувача.
  • Автоматичне маскування – воно не вимагає багато вхідних даних від користувача, але може бути не таким точним.

Давайте тепер подивимося, як застосувати ручне та автоматичне маскування до зображень у коді 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");
}   

Перетворення зображень в інші формати

Щоб перетворити зображення за допомогою Aspose.Imaging.Drawing API, вам потрібно лише завантажити зображення та зберегти його в потрібному вихідному форматі. Наведений нижче фрагмент коду перетворює зображення 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

Якщо ви хочете оцінити API Aspose.Imaging.Drawing, ви можете отримати безкоштовну тимчасову ліцензію, яка дозволить вам використовувати API на повну потужність без будь-яких обмежень.

Висновок

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

Повідомте нам про свої відгуки чи запитання на нашому форумі.