Obrátenie obrázkov s voľným uhlom s priehľadným pozadím je častou požiadavkou pre galérie, tabuľky a dizajnové nástroje v .NET. Aspose.Imaging pre .Net poskytuje priamu API na nahrávanie obrazu, jeho otáčanie podľa vlastného uhlu a ukladanie do formátu, ktorý podporuje transparentnosť.
Kompletný príklad
// 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}");
}
}
}
}
}
- Ako to funguje *
Image.Load
otvorí zdroj. kód skontroluje a klesá naRasterImage
Pre rýchle operácie.raster.Rotate(angle, expandCanvas, Color.Transparent)
- rotujú sa podľa akejkoľvek úrovne hodnoty.- Ušetriť s
PngOptions
zachováva transparentnosť. - Batch režim prechádza priečinok stromu, otáča podporované formáty a píše PNG.
Krok za krokom sprievodca
1) Nahrať obrázok
Použitie Image.Load
Otvoriť zdrojový súbor.Cast na RasterImage
Ak potrebujete špecifických členov.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
2) Otočte sa z akéhokoľvek uhla
Volanie Rotate(angle, expandCanvas, backgroundColor)
.
angle
je v stupňochexpandCanvas = true
Vyhýbajte sa klipeniu rezačným kanvami, aby sa prispôsobili rotujúcim hraniciamColor.Transparent
udržuje pozadie transparentné, ak formát výstupu podporuje alfa
image.Rotate(17, true, Color.Transparent);
3) Uložiť do formátu, ktorý podporuje transparentnosť
PNG podporuje transparentnosť. používať PngOptions
Zachrániť rotujúci výstup s zachovaným alfa kanálom.
image.Save(outputPath, new PngOptions());
Praktické možnosti
- ** Vyhýbajte sa kliešťom**: nastavenie
expandCanvas = true
keď sa otáča v nepravých rohoch - Opaque pozadia: prejsť solid
Color
namiesto toho, abyColor.Transparent
Ak chcete vyplniť pozadie - Nezabudnuteľný výstup: uprednostňuje PNG pre UI, logá a prevody, ktoré vyžadujú okraje kríža a transparentnosť
- Fotografia: ak nepotrebujete transparentnosť, úspora ako JPEG môže znížiť veľkosť súboru
Spoločné pitfály a opravy
- Transparentné pozadie stratené *Zachrániť s
PngOptions
alebo iný formát, ktorý podporuje alfa. JPEG nepodporuje transparentnosť.
- Transparentné pozadie stratené *Zachrániť s
** Časť obrazu po otáčaní chýba**Použitie
expandCanvas = true
Vyrastať kanvas tak, aby rotujúci obsah vyhovoval.Jagované okraje po rotáciiV prípade, že zdroj je nízka rozlíšenie, zvážte revíziu vstupu na vyššiu rozlišenie pred rotaciou, potom zníženie po úspore znížiť viditeľné artefakty.
- pamäť a veľké obrázky *Umiestnite obrázky rýchlo a vyhnite sa načítaniu mnohých veľkých súborov naraz.
Mini kontrolný zoznam
- zaťaženie s
Image.Load
- Rotácia s
image.Rotate(angle, true, Color.Transparent)
- Zachrániť s
new PngOptions()
Pre transparentnosť - Použite pevné pozadie, ak nie je potrebná transparentnosť
- Vizuálne overenie výstupu pre kľúčové aktíva
FAQ
Ktoré formáty zachovávajú transparentnosť po otáčaníPNG a iné alfa formáty. JPEG nezachováva transparentnosť.
** Ako sa otáčať bez rozšírenia kanvasu**Pass expandCanvas = false
Obsah mimo pôvodných hraníc bude kliknutý.
- Môžem otáčať z akéhokoľvek rohu*Uhlový parameter akceptuje akúkoľvek číselnú hodnotu stupňa.
More in this category
- Optimalizácia animovaných GIF v .NET pomocou Aspose.Imaging
- Optimalizácia viacstránkových TIFF pre archív v .NET s aplikáciou Aspose
- Bezproblémová a kvalitne definovaná kompresia obrazu v .NET s Aspose.Imaging
- Data-Driven Animations v .NET s Aspose.Imaging
- HEIC na JPEG/PNG konverzia s Aspose.Imaging pre .NET