Otočování snímků arbitrarním úhlem s průhledným pozadím je častým požadavkem pro galerie, desky a designové nástroje v .NET. Aspose.Imaging pro .Net poskytuje přímý API pro nahrávání obrazu, jeho otáčení podle vlastního úhlu a ukládání do formátu, který podporuje transparentnost.
Kompletní pří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}");
}
}
}
}
}
- Jak to funguje *
Image.LoadOtevře zdroj. kód kontroluje a klade naRasterImagena operaci rastu.raster.Rotate(angle, expandCanvas, Color.Transparent)Rotace v jakékoliv hodnotě.- Úspora s
PngOptionsUdržuje transparentnost. - Batchový režim prochází řádkovým stromem, otáčí podporované formáty a píše PNG.
Krok za krokem průvodce
1) Nahrávejte obrázek
Použití Image.Load Otevřete zdrojový soubor.Cast to RasterImage Pokud potřebujete speciální členy.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
2) Rotace z jakéhokoli úhlu
Volání Rotate(angle, expandCanvas, backgroundColor).
angleJe v stupníchexpandCanvas = trueVyhýbejte se křižování tím, že obnovíte kanvas, aby se vyrovnali s otáčenými hranicemiColor.Transparentudržuje pozadí transparentní, pokud formát výstupu podporuje alfa
image.Rotate(17, true, Color.Transparent);
3) Uložte do formátu, který podporuje transparentnost
PNG podporuje transparentnost. PngOptions Ušetřit rotační výstup s zachovaným alfa kanálem.
image.Save(outputPath, new PngOptions());
Praktické možnosti
- ** Vyhýbejte se klipování**: nastavení
expandCanvas = trueKdyž se otáčí ne pravými úhly - Opaque pozadí: projděte solidní
ColorMísto toho, abyColor.TransparentChcete-li mít plný pozadí - Producce bez ztrát: upřednostňujeme PNG pro UI, logotypy a přehrávače, které vyžadují křížové hranice a transparentnost
- ** Fotografie**: pokud nepotřebujete transparentnost, ušetřit jako JPEG může snížit velikost souboru
Společné pitfady a opravy
- Ztracené pozadí *Zachraňte s
PngOptionsnebo jiný formát, který podporuje alfa. JPEG nepodporuje transparentnost.
- Ztracené pozadí *Zachraňte s
** Část obrazu po otáčení chybí**Použití
expandCanvas = trueVyrůstajte kanvas tak, aby se rotující obsah vyrovnal.Přepravené okraje po rotaciPokud je zdroj nízké rozlišenosti, zvážíte recyklování vstupu na vyšší rozlišení před rotací, pak snížit po ušetření, aby se snížily viditelné artefakty.
- paměť a velké obrázky *Uložte obrázky rychle a vyhněte se načítání mnoha velkých souborů najednou.
Mini kontrolní seznam
- Nabíjejte s
Image.Load - Rotace s
image.Rotate(angle, true, Color.Transparent) - Zachraňte s
new PngOptions()Pro transparentnost - Použijte pevné pozadí, pokud není zapotřebí transparentnosti
- Vizuální ověření výstupu pro klíčové aktivy
FAQ
Které formáty udržují průhlednost po rotaciPNG a jiné alfa-přístupné formáty. JPEG nezachovává transparentnost.
- Jak se otáčíte, aniž byste rozšířili kanvasy*Pass
expandCanvas = falseObsah mimo původní limity bude kliknut.
Můžu se otáčet z jakéhokoli úhluUhlový parametr akceptuje jakékoli číselné hodnoty stupně.