تدور الصور من زاوية تلقائية مع خلفية شفافة هو متطلبات متكررة لمعارض، لوحات المفاتيح، وأدوات التصميم في .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وسيتم تسجيل المحتوى خارج الحدود الأصلية.
يمكنني الدوران من أي زاويةنعم.المقياس الزاوية يقبل أي قيمة درجة رقمية.