رسم الصور النقطية والمتجهة

سواء كنت تقوم بإنشاء موقع ويب، أو تطبيق سطح مكتب، أو تطبيق جوال، فإن القدرة على التعامل مع الصور والرسم عليها تعد جانبًا بالغ الأهمية عند معالجة الصور وتحريرها. لتمكين المطورين من خلال ميزات رسم متقدمة وسهلة التنفيذ، نقدم Aspose.Imaging.Drawing، وهي واجهة برمجة تطبيقات قوية مصممة لتطبيقات C# .NET، وتقدم مجموعة من ميزات رسم الصور.

مكتبة الرسم C# .NET

Aspose.Imaging.Drawing عبارة عن واجهة برمجة تطبيقات قوية تسمح لك بمعالجة الصور النقطية والمتجهة باستخدام تقنيات معالجة الصور المتقدمة. من خلال الوصول إلى البايت الأصلي، تضمن واجهة برمجة التطبيقات (API) سرعة معالجة عالية أثناء إنشاء الصور أو معالجتها. باستخدام واجهة برمجة التطبيقات (API)، يمكنك رسم الكائنات باستخدام معالجة البكسل ومسار الرسومات وتحويل الصور من تنسيق إلى آخر. يستخدم Aspose.Imaging.Drawing Aspose.Drawing كمحرك الرسومات الافتراضي، وهو عبارة عن مكتبة رسومات ثنائية الأبعاد عبر الأنظمة الأساسية توفر مجموعة كاملة من الميزات لرسم النصوص والأشكال الهندسية والصور دون أي تبعيات خارجية.

يمكنك تنزيل وتثبيت Aspose.Imaging.Drawing من NuGet.

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

دعونا الآن نلقي نظرة على بعض الميزات البارزة لـ .NET Draw API واستخدامها بمساعدة التعليمات البرمجية المصدر.

إنشاء الرسومات باستخدام مكتبة الرسم .NET

يتيح لك Aspose.Imaging.Drawing إنشاء صور عن طريق رسم كائنات مختلفة مثل الدوائر والخطوط والمثلثات والمربعات والقطع الناقص. ليس فقط الصور النقطية ولكن يمكنك إنشاء صور متجهة باستخدام واجهة برمجة التطبيقات. دعونا نلقي نظرة على كيفية رسم الصور النقطية والمتجهة في لغة C# باستخدام واجهة برمجة تطبيقات الرسم .NET هذه.

رسم الصورة النقطية

فيما يلي خطوات رسم صورة نقطية باستخدام Aspose.Imaging.Drawing API.

  • أولاً، قم بإنشاء صورة بالتنسيق المطلوب باستخدام طريقة Image.Create().
  • ثم قم بإنشاء كائن من فئة الرسومات وقم بتهيئته باستخدام الصورة التي أنشأناها أعلاه.
  • قم بمسح سطح الصورة باستخدام طريقة 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);

            // قم بتصغير الصورة المرسومة بالكامل مرتين واسحبها إلى منتصف سطح الرسم.
            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 طريقتين لتطبيق إخفاء الصورة:

  • الإخفاء اليدوي - يستخدم مجموعة من عائد الاستثمار كقناع. يتم استخدام عائد الاستثمار لكل شريحة لتحديد القناع. يحتاج إلى مدخلات إضافية من المستخدم.
  • الإخفاء التلقائي - لا يتطلب الكثير من بيانات الإدخال من المستخدم ولكنه قد لا يكون دقيقًا جدًا.

دعونا نرى الآن كيفية تطبيق الإخفاء اليدوي والتلقائي على الصور في كود 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.

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 عدة أنواع من المرشحات التي يمكنك تطبيقها على الصور، مثل median وmotion weiner وgauss weiner وما إلى ذلك.

للتوضيح، ألق نظرة على الكود التالي الذي يطبق المرشح المتوسط على الصورة باستخدام 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. يوضح مقتطف التعليمات البرمجية التالي كيفية تدوير الصورة دون قلبها في 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 أمرًا بسيطًا مثل الفطيرة. ما عليك سوى استدعاء أسلوب تغيير الحجم وتمرير قيم الارتفاع والعرض الجديدة. يوضح مقتطف الكود التالي كيفية تغيير حجم الصورة في 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، فيمكنك الحصول على ترخيص مؤقت مجاني والذي يتيح لك استخدام API بكامل طاقتها دون أي قيود.

خاتمة

في مجال الرسومات ومعالجة الصور، تبرز Aspose.Imaging.Drawing API كأداة متعددة الاستخدامات وقوية لمطوري C# .NET. سواء كنت تتطلع إلى تحسين العناصر المرئية، أو تصحيح تشوهات الصورة، أو تحويل الصور بين التنسيقات، فإن واجهة برمجة التطبيقات هذه توفر مجموعة شاملة من الميزات. مع Aspose.Imaging.Drawing، تصبح معالجة الصور في متناول يدك، مما يمكّنك من إنشاء رسومات جذابة ومذهلة بصريًا برمجيًا.

أخبرنا بتعليقاتك أو استفساراتك على المنتدى.