Vẽ hình ảnh Raster và Vector

Cho dù bạn đang xây dựng một trang web, ứng dụng dành cho máy tính để bàn hay ứng dụng dành cho thiết bị di động, khả năng thao tác và vẽ trên hình ảnh là một khía cạnh quan trọng khi xử lý và chỉnh sửa hình ảnh. Để trao quyền cho các nhà phát triển với các tính năng vẽ nâng cao nhưng dễ thực hiện, chúng tôi giới thiệu Aspose.Imaging.drawing, một API mạnh mẽ được thiết kế cho các ứng dụng C# .NET, cung cấp nhiều tính năng vẽ hình ảnh.

Thư viện bản vẽ C# .NET

Aspose.Imaging.drawing là một API mạnh mẽ cho phép bạn xử lý hình ảnh raster và vector bằng các kỹ thuật xử lý hình ảnh nâng cao. Với quyền truy cập byte gốc, API đảm bảo tốc độ xử lý cao trong khi tạo hoặc xử lý hình ảnh. Sử dụng API, bạn có thể vẽ các đối tượng bằng thao tác pixel và đường dẫn đồ họa cũng như chuyển đổi hình ảnh từ định dạng này sang định dạng khác. Aspose.Imaging.draw sử dụng Aspose. Draw làm công cụ đồ họa mặc định, là thư viện đồ họa 2D đa nền tảng cung cấp một bộ tính năng hoàn chỉnh để vẽ văn bản, hình học và hình ảnh mà không cần bất kỳ sự phụ thuộc bên ngoài nào.

Bạn có thể tải xuống và cài đặt Aspose.Imaging.draw từ NuGet.

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

Bây giờ chúng ta hãy xem xét một số tính năng nổi bật của API vẽ .NET này và cách sử dụng chúng với sự trợ giúp của mã nguồn.

Tạo đồ họa bằng Thư viện bản vẽ .NET

Aspose.Imaging.drawing cho phép bạn tạo hình ảnh bằng cách vẽ các đối tượng khác nhau như hình tròn, đường thẳng, hình tam giác, hình vuông và hình elip. Không chỉ hình ảnh raster mà bạn có thể tạo hình ảnh vector bằng API. Chúng ta hãy xem cách vẽ hình ảnh raster và vector trong C# bằng API vẽ .NET này.

Vẽ hình ảnh raster

Dưới đây là các bước để vẽ hình ảnh raster bằng API Aspose.Imaging.drawing.

  • Đầu tiên, tạo một hình ảnh có định dạng mong muốn bằng phương thức Image.Create().
  • Sau đó, tạo một đối tượng của lớp Graphics và khởi tạo nó bằng Image mà chúng ta đã tạo ở trên.
  • Xóa bề mặt của hình ảnh bằng phương pháp Graphics.Clear.
  • Tạo một Pen mới và khởi tạo nó với màu mong muốn.
  • Vẽ một hình elip (hoặc bất kỳ đối tượng đồ họa nào khác) bằng phương thức Graphics.DrawEllipse().
  • Vẽ một đa giác bằng phương thức Graphics.FillPolygon().
  • Cuối cùng, lưu hình ảnh bằng phương thức Image.Save().

Đoạn mã sau đây cho thấy cách vẽ một hình ảnh trong C#.

string outputFolder = @"Output\";

// Tạo một phiên bản của BmpOptions và đặt các thuộc tính khác nhau của nó
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// Tạo một phiên bản của FileCreateSource và gán nó cho thuộc tính Nguồn 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

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

    // Xóa bề mặt hình ảnh với màu trắng và Tạo và khởi tạo đối tượng Pen với màu xanh lam
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // Vẽ Ellipse bằng cách xác định hình chữ nhật giới hạn có chiều rộng 150 và chiều cao 100. Vẽ một đa giác bằng 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) });
    }

    // Lưu hình ảnh
    image.Save();
}

Vẽ hình ảnh vector

Tương tự như hình ảnh raster, bạn có thể vẽ đồ họa vector, chẳng hạn như SVG, chỉ bằng một vài bước đơn giản. Hãy tạo một hình ảnh vector bằng thư viện vẽ C# của chúng tôi.

  • Đầu tiên, tạo một đối tượng MemoryStream.
  • Sau đó, tải hình ảnh SVG.
  • Rasterize SVG thành PNG và ghi kết quả vào luồng.
  • Tải hình ảnh PNG từ luồng để vẽ thêm.
  • Vẽ hình ảnh PNG trên hình ảnh SVG hiện có.
  • Cuối cùng, lưu kết quả.

Đoạn mã sau đây cho thấy cách vẽ hình ảnh vector trong C#.

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

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // Đầu tiên, rasterize Svg thành PNG và ghi kết quả vào luồng.
    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);

        // Bây giờ hãy tải hình ảnh PNG từ luồng để vẽ thêm.
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // Vẽ trên hình ảnh Svg hiện có.
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // Thu nhỏ toàn bộ hình ảnh đã vẽ xuống 2 lần và vẽ nó vào giữa bề mặt vẽ.
            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);

            // Lưu hình ảnh kết quả
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

Áp dụng mặt nạ cho hình ảnh

Tạo mặt nạ trong chỉnh sửa hình ảnh đề cập đến kỹ thuật ẩn hoặc hiển thị có chọn lọc các phần nhất định của hình ảnh. Nó liên quan đến việc tạo mặt nạ, về cơ bản là một hình ảnh thang độ xám xác định độ trong suốt hoặc độ mờ của từng pixel trong ảnh gốc. Mặt nạ hình ảnh được sử dụng rộng rãi để nhận dạng và chẩn đoán.

Aspose.Image.draw cung cấp hai phương pháp áp dụng mặt nạ hình ảnh:

  • Tạo mặt nạ thủ công - Nó sử dụng một tập hợp ROI làm mặt nạ. ROI cho mỗi lát được sử dụng để xác định mặt nạ. Nó cần thêm đầu vào của người dùng.
  • Tự động tạo mặt nạ - Nó không yêu cầu nhiều dữ liệu đầu vào từ người dùng nhưng có thể không chính xác.

Bây giờ chúng ta hãy xem cách áp dụng mặt nạ thủ công và tự động trên hình ảnh bằng mã C#.

Tạo mặt nạ hình ảnh thủ công

Đoạn mã sau đây cho biết cách áp dụng mặt nạ thủ công trên hình ảnh trong C#.

string outputFolder = @"Output\";

// Tệp nguồn
string sourceFileName = outputFolder + "couple.png";

// Tạo đường dẫn đồ họa
GraphicsPath manualMask = new GraphicsPath();

// Thêm hình dạng
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// Thêm hình
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);

// Đắp mặt nạ
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);
    // Lưu kết quả tạo mặt nạ cuối cùng.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

Tạo mặt nạ hình ảnh tự động

Đoạn mã bên dưới áp dụng tính năng tự động tạo mặt nạ trên hình ảnh bằng API vẽ .NET.

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // Để sử dụng Cắt đồ thị với các nét được tính toán tự động, AutoMaskingGraphCutOptions sẽ được sử dụng.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // Cho biết rằng một phép tính mới về các nét mặc định sẽ được thực hiện trong quá trình phân tách hình ảnh.
        CalculateDefaultStrokes = true,
        
        // Đặt bán kính lông vũ sau quá trình dựa trên kích thước hình ảnh.
        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 });
    }
}

Áp dụng bộ lọc cho hình ảnh

Việc áp dụng các bộ lọc cho hình ảnh phục vụ nhiều mục đích khác nhau và mọi người sử dụng chúng vì nhiều lý do khác nhau, cả về mặt thực tế lẫn tính nghệ thuật. Công dụng phổ biến nhất của bộ lọc hình ảnh bao gồm chỉnh sửa màu sắc, nâng cao chất lượng hình ảnh, áp dụng các hiệu ứng đặc biệt, giảm nhiễu, v.v. Aspose.Imaging.draw hỗ trợ một số loại bộ lọc mà bạn có thể áp dụng cho hình ảnh, chẳng hạn như trung vị, weiner chuyển động, weiner gauss, v.v.

Để minh họa, hãy xem đoạn mã sau áp dụng bộ lọc trung vị cho hình ảnh bằng Aspose.Imaging.drawing.

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

// Tải hình ảnh ồn ào 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // Truyền hình ảnh vào RasterImage
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // Tạo một thể hiện của lớp MedianFilterOptions và đặt kích thước, Áp dụng bộ lọc MedianFilterOptions cho đối tượng RasterImage và Lưu hình ảnh kết quả
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // Lưu hình ảnh
    image.Save(outputFolder + "median_filter.gif");
}

Cắt, xoay và thay đổi kích thước hình ảnh

Cắt, xoay, thay đổi kích thước hình ảnh được coi là tính năng cần thiết của các ứng dụng chỉnh sửa hình ảnh. Chúng là các hoạt động xử lý hình ảnh phổ biến nhất được sử dụng để xử lý hình ảnh kỹ thuật số. Chúng ta hãy xem cách cắt, xoay và thay đổi kích thước hình ảnh bằng API Aspose.Imaging.drawing.

Cắt một hình ảnh

Để cắt hình ảnh, bạn cần cung cấp các giá trị dịch chuyển cho cả bốn cạnh của hình ảnh. Dựa trên các giá trị này, giới hạn hình ảnh sẽ được dịch chuyển về phía giữa hình ảnh. Đoạn mã C# sau đây cắt hình ảnh dựa trên các giá trị dịch chuyển được cung cấp.

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

// Tải hình ảnh hiện có vào một thể hiện của lớp RasterImage
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // Trước khi cắt, hình ảnh phải được lưu vào bộ nhớ đệm để có hiệu suất tốt hơn
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // Xác định giá trị dịch chuyển cho cả bốn phía
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // Dựa trên các giá trị dịch chuyển, áp dụng cắt xén hình ảnh Phương pháp cắt xén sẽ dịch chuyển giới hạn hình ảnh về phía giữa hình ảnh và Lưu kết quả vào đĩa
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // Lưu hình ảnh đã cắt
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

Xoay một hình ảnh

Để xoay một hình ảnh, Aspose.Imaging.drawing cung cấp phương thức RotateFlip, phương thức này không chỉ xoay hình ảnh mà còn lật nó (nếu cần). Bạn có thể chọn tùy chọn xoay và lật mong muốn từ RotateFlipType enum. Đoạn mã sau đây cho biết cách xoay hình ảnh nhưng không lật nó trong C#.

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

// Đang tải và xoay hình ảnh
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // Xoay hình ảnh
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // Lưu hình ảnh
    image.Save(outputFolder + "rotated_image.jpg");
}

Thay đổi kích thước hình ảnh

Thay đổi kích thước hình ảnh bằng Aspose.Imaging.drawing đơn giản như một chiếc bánh. Chỉ cần gọi phương thức Thay đổi kích thước và chuyển các giá trị chiều cao và chiều rộng mới. Đoạn mã sau đây cho biết cách thay đổi kích thước hình ảnh trong C#.

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

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // Thay đổi kích thước hình ảnh
    image.Resize(300, 300);

    // Lưu hình ảnh
    image.Save(outputFolder + "resized_image.jpg");
}   

Chuyển đổi hình ảnh sang các định dạng khác

Để chuyển đổi hình ảnh bằng API Aspose.Imaging.drawing, bạn chỉ cần tải hình ảnh và lưu nó ở định dạng đầu ra mong muốn. Đoạn mã sau chuyển đổi hình ảnh JPG thành các định dạng WebP, PSD, PDF và TIFF.

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

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // Lưu ở các định dạng hình ảnh khác nhau
    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));

    // Lưu dưới dạng PDF
    PdfOptions exportOptions = new PdfOptions();
    exportOptions.PdfDocumentInfo = new Aspose.Imaging.FileFormats.Pdf.PdfDocumentInfo();
    img.Save(outputFolder + "output.pdf", exportOptions);
}

Nhận giấy phép API miễn phí

Nếu bạn muốn đánh giá API Aspose.Imaging.drawing, bạn có thể nhận giấy phép tạm thời miễn phí cho phép bạn sử dụng API hết công suất mà không có bất kỳ giới hạn nào.

Phần kết luận

Trong lĩnh vực xử lý đồ họa và hình ảnh, API Aspose.Imaging.drawing nổi bật như một công cụ linh hoạt và mạnh mẽ dành cho các nhà phát triển C# .NET. Cho dù bạn đang tìm cách nâng cao các yếu tố hình ảnh, sửa lỗi biến dạng hình ảnh hay chuyển đổi hình ảnh giữa các định dạng, API này đều cung cấp một bộ tính năng toàn diện. Với Aspose.Imaging.drawing, thao tác hình ảnh nằm trong tầm tay bạn, cho phép bạn tạo đồ họa hấp dẫn và trực quan ấn tượng theo chương trình.

Hãy cho chúng tôi biết về phản hồi hoặc thắc mắc của bạn trên diễn đàn của chúng tôi.