Att rotera bilder i en önskvärd vinkel med en transparent bakgrund är ett vanligt krav för gallerier, dashboards och designverktyg i .NET. Aspose.Imaging för .Net ger en direkt API för att ladda en bild, rotera den genom en anpassad vinkel och spara till ett format som stöder öppenhet.
Fullständigt exempel
// 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}");
}
}
}
}
}
- Hur det fungerar *
Image.Load
öppnar källan. koden kontrollerar och kastar tillRasterImage
för rasteroperationer.raster.Rotate(angle, expandCanvas, Color.Transparent)
Rotera med någon grad av värde.- Spara med
PngOptions
upprätthåller öppenheten. - Batch-läget går en katalogträd, roterar stödda format och skriver PNG.
Steg för steg guide
1) Ladda upp bilden
Användning Image.Load
för att öppna källfilen.Cast till RasterImage
Om du behöver raster-specifika medlemmar.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
2) Rotera med någon vinkel
ringer Rotate(angle, expandCanvas, backgroundColor)
.
angle
är i graderexpandCanvas = true
undviker klippning genom att återställa kanvas för att passa de roterade gränsernaColor.Transparent
håller bakgrunden transparent om utgångsformat stöder alfa
image.Rotate(17, true, Color.Transparent);
3) Spara i ett format som stöder öppenhet
PNG stöder öppenhet. användning PngOptions
för att spara den roterade utgången med alfa-kanalen bevarad.
image.Save(outputPath, new PngOptions());
Praktiska alternativ
- Förhindra klippning: Set
expandCanvas = true
när man roterar med icke-rätta vinklar - Opaque bakgrunder: pass en solid
Color
I stället förColor.Transparent
Om du vill ha en fylld bakgrund - Lös output: föredrar PNG för UI, logotyper och överlägsenheter som kräver krispändar och öppenhet
- Fotografi: om du inte behöver transparens kan spara som JPEG minska filstorleken
Vanliga pitfalls och fixar
Transparent bakgrund förloradSpara med
PngOptions
eller ett annat format som stöder alfa. JPEG stödjer inte öppenhet.**Partitioner av bilden saknas efter rotation*Användning
expandCanvas = true
att växa kanvas så att det roterade innehållet passar.Jaggade ändar efter rotationOm din källa är låg upplösning, överväga att återställa inmatningen till en högre resolution innan du roterar, sedan sänka efter spara för att minska synliga artefakter.
Memoria och stora bilderPlacera bilder snabbt och undvika att ladda många stora filer på en gång. Konfigurera skiva caching för stora bitar om det behövs.
Mini checklista
- Ladda med
Image.Load
- Rotera med
image.Rotate(angle, true, Color.Transparent)
- Spara med
new PngOptions()
För öppenhet - Använd en solid bakgrund om transparens inte krävs
- Validerar output visuellt för nyckelfärdiga tillgångar
FAQ
Vilka format håller öppenhet efter rotationPNG och andra alfa-kapabla format. JPEG behåller inte öppenhet.
**Hur kan jag rotera utan att utöka kanvas*Pass expandCanvas = false
Innehåll utanför de ursprungliga gränserna kommer att klippas.
- Jag kan rotera från vilken vinkel som helst*Ja. Vinkelparametern accepterar någon numerisk gradvärde.