הסיבוב של תמונות באזור אובייקטיבי עם רקע שקוף הוא דרישה נפוצה עבור גלריות, מדפסת, וכלים עיצוב ב- .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 to 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());

אפשרויות מעשיות

    • הימנעות מריחואנה *: Set expandCanvas = true כאשר מסתובבים בפינות לא ישרות
  • ** רקע אופק**: עובר קפדנית Color במקום Color.Transparent אם אתה רוצה רקע מלא
  • יצוא חסר אובדן: מעדיפים PNG עבור UI, לוגו, ומקומות העליונים הדורשים גבולות קריספ ופרטיות
  • צילום: אם אתה לא צריך שקיפות, חיסכון כמו JPEG יכול להפחית את גודל הקובץ

צינורות נפוצים ופיקים

    • רקע ברור אבוד *להציל עם PngOptions או פורמט אחר תומך ב- alpha. JPEG אינו מספק תמיכה בשקיפות.
  • חלקים של התמונה נעלמים לאחר הסיבובשימוש expandCanvas = true להגדיל את הקנבוסים כך שהתוכן המסתובב מתאים.

  • הגבולות שנחטפו לאחר הסיבובאם המקור שלך הוא ברזולוציה נמוכה, לשקול להחזיר את ההכנסה לבידוד גבוה יותר לפני הסיבוב, ולאחר מכן להוריד לאחר חיסכון כדי להפחית אובייקטים נראים.

    • זיכרון ותמונות גדולות *להציב תמונות במהירות ולמנוע טעינה של קבצים גדולים רבים בו זמנית.

מיני צ’קליסט

  • טעינה עם Image.Load
  • סיבוב עם image.Rotate(angle, true, Color.Transparent)
  • להציל עם new PngOptions() על שקיפות
  • השתמש ברקע מוצק אם לא נדרשת שקיפות
  • אימות ויזואלי עבור נכסים מרכזיים

FAQ

איזה פורמטים לשמור על שקיפות לאחר הסיבובPNG ופורמטים אלפא אפשריים אחרים. JPEG אינו שומר על שקיפות.

  • איך אני מסתובב בלי להגדיל את הקנבוס*Pass expandCanvas = falseתוכן מחוץ לגבולות המקוריים יפורסם.

  • אני יכול להסתובב בכל זווית *כן.הפרמטר האנגלית מקבלת כל ערך דיגיטלי.

More in this category