چرخش تصاویر از زاویه ای داوطلبانه با یک پس زمینه شفاف یک نیاز مکرر برای گالری ها، دسکتاپ ها و ابزارهای طراحی در .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
شفافیت را حفظ می کند. - حالت باتچ یک درخت دایرکتوری را راه می برد، فرمت های پشتیبانی شده را چرخانده و PNG ها را می نویسد.
راهنمای گام به گام
1- تصویر را بارگذاری کنید
استفاده Image.Load
برای باز کردن فایل منبع.Cast to RasterImage
اگر شما نیاز به اعضای خاص راستر.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
۲) از هر زاویه ای
تماس 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 برای UI ها، لوگوها و سطوح که نیاز به لبه های کروز و شفافیت دارند
- تصویر: اگر نیازی به شفافیت ندارید، پس انداز به عنوان 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
- بهینه سازی GIF های متحرک در .NET با استفاده از Aspose.Imaging
- بهینه سازی TIFF های چند صفحه ای برای آرشیو در .NET با Aspose
- HEIC به JPEG/PNG تبدیل با Aspose.Imaging برای .NET
- استخراج تصاویر محصول برای پلتفرم های تجارت الکترونیک با استفاده از Aspose.Imaging برای .NET
- انیمیشن های مبتنی بر داده در .NET با Aspose.Imaging