วาดภาพแรสเตอร์และเวกเตอร์

ไม่ว่าคุณจะสร้างเว็บไซต์ แอปพลิเคชันเดสก์ท็อป หรือแอปมือถือ ความสามารถในการจัดการและวาดภาพถือเป็นสิ่งสำคัญในการประมวลผลและแก้ไขรูปภาพ เพื่อส่งเสริมนักพัฒนาด้วยฟีเจอร์การวาดภาพขั้นสูงแต่ใช้งานง่าย เราขอแนะนำ 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

ตอนนี้เรามาดูคุณสมบัติเด่นบางประการของ .NET Drawing API และการใช้งานด้วยความช่วยเหลือของซอร์สโค้ดกัน

การสร้างกราฟิกโดยใช้ .NET Drawing Library

Aspose.Imaging. Drawing ช่วยให้คุณสร้างภาพโดยการวาดวัตถุต่างๆ เช่น วงกลม เส้น สามเหลี่ยม สี่เหลี่ยม และวงรี ไม่เพียงแต่ภาพแรสเตอร์เท่านั้น แต่คุณสามารถสร้างภาพเวกเตอร์โดยใช้ API ได้ มาดูวิธีการวาดภาพแรสเตอร์และเวกเตอร์ใน C# โดยใช้ .NET drawing API นี้กันดีกว่า

วาดภาพแรสเตอร์

ด้านล่างนี้เป็นขั้นตอนในการวาดภาพแรสเตอร์โดยใช้ Aspose.Imaging. Drawing API

  • ขั้นแรก สร้างรูปภาพในรูปแบบที่ต้องการโดยใช้วิธี Image.Create()
  • จากนั้นสร้างอ็อบเจ็กต์ของคลาส Graphics และเริ่มต้นด้วย Image ที่เราสร้างขึ้นด้านบน
  • ล้างพื้นผิวของภาพโดยใช้วิธี Graphics.Clear
  • สร้างปากกาใหม่และเริ่มต้นด้วยสีที่ต้องการ
  • วาดวงรี (หรือวัตถุกราฟิกอื่น ๆ ) โดยใช้เมธอด Graphics.DrawEllipse()
  • วาดรูปหลายเหลี่ยมโดยใช้วิธี Graphics.FillPolygon()
  • สุดท้าย ให้บันทึกรูปภาพโดยใช้วิธี Image.Save()

ข้อมูลโค้ดต่อไปนี้แสดงวิธีการวาดภาพใน C#

string outputFolder = @"Output\";

// สร้างอินสแตนซ์ของ BmpOptions และตั้งค่าคุณสมบัติต่างๆ
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// สร้างอินสแตนซ์ของ FileCreateSource และกำหนดให้กับคุณสมบัติแหล่งที่มา 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

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

    // ล้างพื้นผิวของภาพด้วยสีขาว และสร้างและเริ่มต้นวัตถุปากกาด้วยสีน้ำเงิน
    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 });
    }
}

การปิดบังรูปภาพอัตโนมัติ

ข้อมูลโค้ดด้านล่างใช้การมาสก์อัตโนมัติบนรูปภาพโดยใช้ .NET drawing API

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

ครอบตัด หมุน และปรับขนาดรูปภาพ

การครอบตัด การหมุน และการปรับขนาดรูปภาพถือเป็นคุณสมบัติที่สำคัญของแอปพลิเคชันการแก้ไขรูปภาพ เป็นการดำเนินการประมวลผลภาพทั่วไปที่ใช้เพื่อจัดการภาพดิจิทัล มาดูวิธีการครอบตัด หมุน และปรับขนาดรูปภาพโดยใช้ Aspose.Imaging. Drawing API กัน

ครอบตัดรูปภาพ

หากต้องการครอบตัดรูปภาพ คุณต้องระบุค่าการเปลี่ยนแปลงสำหรับทั้งสี่ด้านของรูปภาพ ตามค่าเหล่านี้ ขอบเขตรูปภาพจะเลื่อนไปทางกึ่งกลางของรูปภาพ ข้อมูลโค้ด 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 enum ข้อมูลโค้ดต่อไปนี้แสดงวิธีการหมุนรูปภาพแต่ไม่พลิกใน 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 ฟรี

หากคุณต้องการประเมิน Aspose.Imaging. Drawing API คุณสามารถ [รับใบอนุญาตชั่วคราวฟรี] ได้ 4 ซึ่งช่วยให้คุณใช้ API ได้เต็มประสิทธิภาพโดยไม่มีข้อจำกัดใดๆ

บทสรุป

ในขอบเขตของการประมวลผลกราฟิกและรูปภาพ Aspose.Imaging. Drawing API มีความโดดเด่นในฐานะเครื่องมืออเนกประสงค์และทรงประสิทธิภาพสำหรับนักพัฒนา C# .NET ไม่ว่าคุณกำลังมองหาการปรับปรุงองค์ประกอบภาพ แก้ไขการบิดเบือนของภาพ หรือแปลงรูปภาพระหว่างรูปแบบ API นี้มีชุดคุณลักษณะที่ครอบคลุม ด้วย Aspose.Imaging.Drawing การปรับแต่งภาพจะเกิดขึ้นเพียงปลายนิ้วสัมผัส ช่วยให้คุณสร้างกราฟิกที่สวยงามน่าดึงดูดและสวยงามโดยทางโปรแกรม

แจ้งให้เราทราบเกี่ยวกับข้อเสนอแนะหรือข้อสงสัยของคุณใน ฟอรั่ม ของเรา