הסיבוב של תמונות באזור אובייקטיבי עם רקע שקוף הוא דרישה נפוצה עבור גלריות, מדפסת, וכלים עיצוב ב- .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כאשר מסתובבים בפינות לא ישרות
- הימנעות מריחואנה *: Set
- ** רקע אופק**: עובר קפדנית
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תוכן מחוץ לגבולות המקוריים יפורסם.אני יכול להסתובב בכל זווית *כן.הפרמטר האנגלית מקבלת כל ערך דיגיטלי.