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

نموذج كامل

// File: Program.cs
// Requires NuGet: Aspose.Imaging

using System;
using System.Collections.Generic;
using System.IO;
using Aspose.Imaging;
using Aspose.Imaging.ImageOptions;

namespace RotateTransparentDemo
{
    public static class Program
    {
        public static int Main(string[] args)
        {
            try
            {
                if (args.Length == 0)
                {
                    // Single-file demo paths. Replace with your own files or pass CLI args.
                    var input  = "input.png";         // source can be PNG, JPG, etc.
                    var output = "rotated-output.png"; // must be PNG to preserve transparency
                    RotateSingle(input, output, angleDegrees: 17f, expandCanvas: true);
                    Console.WriteLine($"Saved: {output}");
                    return 0;
                }

                // CLI:
                // 1) Single file:
                //    RotateTransparentDemo.exe <inputPath> <outputPath> <angleDegrees> [expandCanvas:true|false]
                //
                // 2) Batch folder:
                //    RotateTransparentDemo.exe --batch <inputDir> <outputDir> <angleDegrees> [expandCanvas:true|false]

                if (args[0].Equals("--batch", StringComparison.OrdinalIgnoreCase))
                {
                    if (args.Length < 4)
                    {
                        Console.Error.WriteLine("Usage: --batch <inputDir> <outputDir> <angleDegrees> [expandCanvas:true|false]");
                        return 2;
                    }

                    var inputDir     = args[1];
                    var outputDir    = args[2];
                    var angle        = float.Parse(args[3]);
                    var expandCanvas = args.Length >= 5 ? bool.Parse(args[4]) : true;

                    BatchRotate(inputDir, outputDir, angle, expandCanvas);
                    Console.WriteLine($"Batch complete. Output in: {outputDir}");
                    return 0;
                }
                else
                {
                    if (args.Length < 3)
                    {
                        Console.Error.WriteLine("Usage: <inputPath> <outputPath> <angleDegrees> [expandCanvas:true|false]");
                        return 2;
                    }

                    var inputPath    = args[0];
                    var outputPath   = args[1];
                    var angle        = float.Parse(args[2]);
                    var expandCanvas = args.Length >= 4 ? bool.Parse(args[3]) : true;

                    RotateSingle(inputPath, outputPath, angle, expandCanvas);
                    Console.WriteLine($"Saved: {outputPath}");
                    return 0;
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("Error: " + ex.Message);
                return 1;
            }
        }

        /// <summary>
        /// Rotates a single image by an arbitrary angle and preserves transparency in the output PNG.
        /// </summary>
        private static void RotateSingle(string inputPath, string outputPath, float angleDegrees, bool expandCanvas)
        {
            if (!File.Exists(inputPath))
                throw new FileNotFoundException("Input image not found.", inputPath);

            // If you expect large images or batches, you can enable disk cache to reduce RAM pressure:
            // Aspose.Imaging.Cache.CacheType   = Aspose.Imaging.Cache.CacheType.CacheOnDisk;
            // Aspose.Imaging.Cache.CacheFolder = Path.GetFullPath(".imaging-cache");
            // Aspose.Imaging.Cache.CacheSize   = 512L * 1024 * 1024; // 512 MB

            using (var image = Image.Load(inputPath))
            {
                // Raster operations are available on RasterImage
                if (image is not RasterImage raster)
                    throw new InvalidOperationException("Loaded image is not a raster image.");

                // Rotate by an arbitrary angle. Set expandCanvas to true to avoid clipping.
                // Color.Transparent keeps the background transparent for alpha-capable formats.
                raster.Rotate(angleDegrees, expandCanvas, Color.Transparent);

                // Save as PNG to preserve alpha channel
                var pngOptions = new PngOptions
                {
                    // Most cases do not need explicit color type; leaving defaults preserves alpha.
                    // Uncomment if you want to force RGBA:
                    // ColorType = Aspose.Imaging.FileFormats.Png.PngColorType.TruecolorWithAlpha
                };

                // Ensure output directory exists
                Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(outputPath)) ?? ".");

                raster.Save(outputPath, pngOptions);
            }
        }

        /// <summary>
        /// Rotates all supported images in a folder and writes PNG outputs with transparency preserved.
        /// </summary>
        private static void BatchRotate(string inputDir, string outputDir, float angleDegrees, bool expandCanvas)
        {
            if (!Directory.Exists(inputDir))
                throw new DirectoryNotFoundException("Input directory not found: " + inputDir);

            Directory.CreateDirectory(outputDir);

            // Common raster extensions. Adjust as needed.
            var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
            {
                ".png", ".jpg", ".jpeg", ".bmp", ".gif", ".tif", ".tiff", ".webp"
            };

            var files = Directory.GetFiles(inputDir, "*.*", SearchOption.AllDirectories);
            foreach (var file in files)
            {
                var ext = Path.GetExtension(file);
                if (!extensions.Contains(ext))
                    continue;

                var rel     = Path.GetRelativePath(inputDir, file);
                var relBase = Path.ChangeExtension(rel, ".png"); // output is PNG to keep transparency
                var outPath = Path.Combine(outputDir, relBase);

                Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(outPath)) ?? ".");

                try
                {
                    RotateSingle(file, outPath, angleDegrees, expandCanvas);
                    Console.WriteLine($"OK  {rel} -> {relBase}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"ERR {rel}: {ex.Message}");
                }
            }
        }
    }
}
  • كيف يعمل *
  • Image.Load يفتح المصدر.الرمز يفحص ويضع في RasterImage للعمليات السرعة.
  • raster.Rotate(angle, expandCanvas, Color.Transparent) وتدور بأي درجة من القيمة.
  • الادخار مع PngOptions يحافظ على الشفافية.
  • يتجول وضع المفاتيح في شجرة السجلات ، ويتحول إلى تنسيقات مدعومة ، ويكتب PNGs.

دليل خطوة بخطوة

1) تحميل الصورة

استخدام Image.Load لفتح الملف المصدر.Cast إلى RasterImage إذا كنت بحاجة إلى أعضاء محددين.

using (var image = (RasterImage)Image.Load(inputPath))
{
    // work with the image here
}

2- الدوران من أي زاوية

مكالمة Rotate(angle, expandCanvas, backgroundColor).

  • angle في الدرجات
  • expandCanvas = true تجنب الانحناء عن طريق إعادة تثبيت الأقواس لتناسب الحدود المستديرة
  • Color.Transparent الحفاظ على خلفية شفافة إذا كان تنسيق الإخراج يدعم ألفا
image.Rotate(17, true, Color.Transparent);

3) حفظ إلى تنسيق يدعم الشفافية

PNG يدعم الشفافية.استخدام PngOptions لتخزين الإنتاج المتحول مع قناة ألفا المحفوظة.

image.Save(outputPath, new PngOptions());

الخيارات العملية

  • ** تجنب الانحناء**: إعداد expandCanvas = true عند الدوران بالزوايا غير اليمينية
  • الخلفيات الخلفية: اجتياز قوية Color بدلاً من Color.Transparent إذا كنت تريد خلفية ممتلئة
  • الإنتاج الخالي من الأضرار: تفضيل PNG لأجهزة الكمبيوتر اللاسلكية والشعارات والمساحات التي تحتاج إلى حواف الصدمة والشفافية
  • التصوير الفوتوغرافي: إذا لم تكن بحاجة إلى الشفافية، فإن توفير JPEG يمكن أن يقلل من حجم الملف

المشاكل المشتركة والتصحيح

    • الخلفية الشفافة المفقودة*إنقاذ مع PngOptions أو تنسيق آخر يدعم ألفا. JPEG لا تدعم الشفافية.
  • تختفي أجزاء من الصورة بعد الدوراناستخدام expandCanvas = true لتنمو الأقواس بحيث يناسب المحتوى المنحني.

    • الحواف المطاطية بعد الدوران *إذا كانت مصدرك منخفضة الدقة، فكر في إعادة إدخال الإدخل إلى دقة أعلى قبل الدوران، ثم انخفاض بعد التخزين للحد من المواد المرئية.
    • الذاكرة والصور الكبيرة *توفير الصور بسرعة وتجنب تحميل العديد من الملفات الكبيرة في وقت واحد.

قائمة التحقق الصغيرة

  • تحميل مع Image.Load
  • الدوران مع image.Rotate(angle, true, Color.Transparent)
  • إنقاذ مع new PngOptions() من أجل الشفافية
  • استخدم خلفية صلبة إذا لم يكن هناك حاجة إلى الشفافية
  • التحقق من الناتج بصريًا للأصول الرئيسية

FAQ

الشكل الذي يحافظ على الشفافية بعد الدورانPNG وغيرها من تنسيقات ألفا قابلة. JPEG لا يحافظ على الشفافية.

كيف يمكنني الدوران دون توسيع القماشPass expandCanvas = falseوسيتم تسجيل المحتوى خارج الحدود الأصلية.

يمكنني الدوران من أي زاويةنعم.المقياس الزاوية يقبل أي قيمة درجة رقمية.

More in this category