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.Load
Otevře zdroj. kód kontroluje a klade naRasterImage
na operaci rastu.raster.Rotate(angle, expandCanvas, Color.Transparent)
Rotace v jakékoliv hodnotě.- Úspora s
PngOptions
Udrž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)
.
angle
Je v stupníchexpandCanvas = true
Vyhýbejte se křižování tím, že obnovíte kanvas, aby se vyrovnali s otáčenými hranicemiColor.Transparent
udrž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 = true
Když se otáčí ne pravými úhly - Opaque pozadí: projděte solidní
Color
Místo toho, abyColor.Transparent
Chcete-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
PngOptions
nebo jiný formát, který podporuje alfa. JPEG nepodporuje transparentnost.
- Ztracené pozadí *Zachraňte s
** Část obrazu po otáčení chybí**Použití
expandCanvas = true
Vyrů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 = false
Obsah mimo původní limity bude kliknut.
Můžu se otáčet z jakéhokoli úhluUhlový parametr akceptuje jakékoli číselné hodnoty stupně.