Das Drehen von Bildern durch einen arbiträren Winkel mit einem transparenten Hintergrund ist eine häufige Anforderung für Galerien, Dashboards und Design-Tools in .NET. Aspose.Imaging für .Net bietet eine direkte API, um ein Bild zu laden, es durch ein angepasstes Winkel zu drehen und zu einem Format zu speichern, das Transparenz unterstützt.
Vollständiges Beispiel
// 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}");
}
}
}
}
}
- Wie es funktioniert *
Image.Loadöffnet die Quelle. Der Code überprüft und kastet aufRasterImagefür Raster Operationen.raster.Rotate(angle, expandCanvas, Color.Transparent)Routen mit jedem Grad Wert.- Sparen mit
PngOptionsdie Transparenz beibehalten. - Das Batch-Modus verläuft ein Registerbaum, dreht unterstützte Formate und schreibt PNGs.
Schritt für Schritt Guide
1) Laden Sie das Bild
Use Image.Load zum Öffnen der Quelldatei.Cast to RasterImage wenn Sie Raster-spezifische Mitglieder benötigen.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
2) Routen aus jeder Ecke
Call Rotate(angle, expandCanvas, backgroundColor).
angleist in GradexpandCanvas = trueVermeiden Sie Klippen, indem Sie die Kanvas umzusetzen, um die rotierten Grenzen anzupassenColor.TransparentHalte den Hintergrund transparent, wenn das Ausgangsformat Alpha unterstützt
image.Rotate(17, true, Color.Transparent);
3) Speichern Sie in ein Format, das Transparenz unterstützt
PNG unterstützt Transparenz. PngOptions um den rotierten Ausgang mit dem alpha-Kanal bewahrt zu speichern.
image.Save(outputPath, new PngOptions());
Praktische Optionen
- Vermeiden Sie Clipping*: Set
expandCanvas = truewenn Sie durch nicht rechte Ecke drehen
- Vermeiden Sie Clipping*: Set
- Opaque Hintergründe: Pass eine solide
ColorStatt derColor.TransparentWenn Sie einen gefüllten Hintergrund wollen - Beschädigungslose Produktion: Vorzugsweise PNG für UI, Logos und Übersetzungen, die Krisp-Einen und Transparenz benötigen
- Fotografie: Wenn Sie keine Transparenz benötigen, können JPEG-Sparungen die Dateigröße verringern
Gemeinsame Pitfalls und Fixes
- Transparente Hintergründe verloren*Sparen Sie mit
PngOptionsoder ein anderes Format, das alpha unterstützt. JPEG Unterstützt keine Transparenz.
- Transparente Hintergründe verloren*Sparen Sie mit
**Teile des Bildes verschwinden nach Rotation*Use
expandCanvas = trueum die Kanvas zu wachsen, so dass der rotierte Inhalt passt.- Gefahren nach der Rotation*Wenn Ihre Quelle eine niedrige Auflösung hat, berücksichtigen Sie, die Eingabe zu einer höheren Resolution vor der Rotation zurückzuziehen, dann nach dem Einsparen abzuschalten, um sichtbare Artefakte zu reduzieren.
- Gedächtnis und große Bilder*Stellen Sie Bilder schnell bereit und vermeiden Sie, viele große Dateien gleichzeitig zu laden. Konfigurieren Sie Disk-Caching für große Battchen, wenn nötig.
Mini Checkliste
- Laden mit
Image.Load - Rotation mit
image.Rotate(angle, true, Color.Transparent) - Sparen Sie mit
new PngOptions()Für Transparenz - Verwenden Sie einen soliden Hintergrund, wenn Transparenz nicht erforderlich ist
- Validieren Sie die Produktion visuell für Schlüsselvermögenswerte
FAQ
**Welche Formate halten nach Rotation Transparenz*PNG und andere alpha-fähige Formate. JPEG behält keine Transparenz.
Wie kann ich rotieren, ohne die Kanvas zu erweiternPass expandCanvas = falseInhalte außerhalb der ursprünglichen Grenzen werden geklipt.
- Ich kann mit jedem Winkel drehen*Ja. Der Winkelparameter akzeptiert jede numerische Gradwert.