Rotarea imaginilor printr-un unghi arbitrar cu un fundal transparent este o cerință frecventă pentru galerii, dashboards și instrumente de proiectare în .NET. Aspose.Imaging pentru .Net oferă o API directă de încărcare a unei imagini, de rotație prin un unghie personalizată și de salvare la un format care susține transparența.
Exemplu complet
// 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}");
}
}
}
}
}
Cum funcționează *
Image.Load
deschide sursă. codul verifică și expune laRasterImage
pentru operaţiunile de raster.raster.Rotate(angle, expandCanvas, Color.Transparent)
se întoarce la orice grad de valoare.- economisirea cu
PngOptions
păstrează transparența. - Modul de batch merge pe un copac de directorie, rotează formate susținute și scrie PNG-uri.
Ghidul pas cu pas
1) Încărcați imaginea
Utilizarea Image.Load
pentru a deschide fișierul de sursă. RasterImage
Dacă aveți nevoie de membri specificați pentru raster.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
2) Rotați prin orice unghi
apeluri Rotate(angle, expandCanvas, backgroundColor)
.
angle
Este în gradeexpandCanvas = true
Evita clipirea prin resetarea canvasului pentru a se potrivi cu limitele rotateColor.Transparent
păstrează fundalul transparent dacă formatul de ieșire susține alfa
image.Rotate(17, true, Color.Transparent);
3) Salvați într-un format care susține transparența
PNG susține transparența. utilizare PngOptions
pentru a salva ieșirea rotată cu canalul alfa păstrat.
image.Save(outputPath, new PngOptions());
Opțiuni practice
- ** Evitați cliparea**: set
expandCanvas = true
când se rotează prin unghiuri non-drepte - Fondul opac: trece un solid
Color
În loc deColor.Transparent
Dacă doriți un fundal plin - Producere fără pierderi: Preferă PNG pentru UI, logo-uri și suprafețe care necesită margini de crisp și transparență
- Fotografie: dacă nu aveți nevoie de transparență, economisirea ca JPEG poate reduce dimensiunea fișierului
Pistole comune și fixări
Fonturi transparente pierdutesalvare cu
PngOptions
sau un alt format care susține alfa. JPEG nu suportă transparența.Parte ale imaginii sunt lipsite după rotațieUtilizarea
expandCanvas = true
să crească canvasul astfel încât conținutul rotativ să se potrivească.Războiul după rotațieÎn cazul în care sursă este de rezoluție scăzută, luați în considerare reîncărcarea intrării la un nivel mai ridicat înainte de rotație, apoi scala după salvare pentru a reduce artefacte vizibile.
Memorie și imagini mariDispuneți imagini rapid și evitați încărcarea mai multor fișiere mari la un moment dat. Configurați caching-ul discului pentru batch-uri mari dacă este necesar.
Mini lista de verificare
- încărcaţi cu
Image.Load
- Rotaţi cu
image.Rotate(angle, true, Color.Transparent)
- salvare cu
new PngOptions()
Pentru transparență - Utilizați un fundal solid dacă nu este necesară transparența
- Validarea vizuală a producției pentru activele cheie
FAQ
Care formate păstrează transparența după rotațiePNG și alte formate alfa-capabile. JPEG nu păstrează transparența.
Cum să rotez fără a extinde canvasulPass expandCanvas = false
Conținutul din afara limitelor originale va fi clipat.
- Pot rotati prin orice unghi*Parametru de unghi acceptă orice valoare de grad numeric.
More in this category
- Optimizarea GIF-urilor animate în .NET folosind Aspose.Imaging
- Optimizarea TIFF-urilor multi pagini pentru arhivare în .NET cu Aspose
- Animații cu date în .NET cu Aspose.Imaging
- Compararea pierderii vs. compresia imaginii fără pierderi în .NET folosind Aspose.Imaging
- Compresia imaginii fără pierderi și de calitate în .NET cu Aspose.Imaging