Rotering af billeder i en vilkårlig vinkel med en gennemsigtig baggrund er et hyppigt krav for gallerier, dashboards og designværktøjer i .NET. Aspose.Imaging for .Net giver en direkte API til at oplade et billede, rotere det ved en tilpasset vinkel, og gemme til et format, der understøtter transparens.
Et fuldstændigt eksempel
// 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}");
}
}
}
}
}
- Hvordan det virker *
Image.Load
åbner kilden. koden kontrollerer og kaster tilRasterImage
for rasteroperationer.raster.Rotate(angle, expandCanvas, Color.Transparent)
Router af enhver grad af værdi.- Besparelse med
PngOptions
bevare gennemsigtigheden. - Batch-modus går en katalogtræ, roterer støttede formater og skriver PNG’er.
Step-by-step vejledning
1) Lad billedet op
Brug af Image.Load
at åbne kildefilen.Cast til RasterImage
Hvis du har brug for raster-specifik medlemmer.
using (var image = (RasterImage)Image.Load(inputPath))
{
// work with the image here
}
2) Rotation af ethvert hjørne
Ring til Rotate(angle, expandCanvas, backgroundColor)
.
angle
Det er i graderexpandCanvas = true
Undgå klipping ved at genanlægge kanvas til at passe til de roterede grænserColor.Transparent
holder baggrunden gennemsigtig, hvis udgangsformatet understøtter alfa
image.Rotate(17, true, Color.Transparent);
3) Spare til et format, der understøtter gennemsigtighed
PNG støtter gennemsigtighed. brug PngOptions
at redde den roterede udgang med den alfa kanal bevaret.
image.Save(outputPath, new PngOptions());
Praktiske muligheder
- ** Undgå klipning**: set
expandCanvas = true
Når man roterer ved ikke-rørende hjørner - Opaque baggrunde: passer en solid
Color
I stedet forColor.Transparent
Hvis du vil have en fyldt baggrund - Løs udgang: foretrækker PNG til UI’er, logos og overlags, der har brug for krisp kanter og gennemsigtighed
- Fotografi: Hvis du ikke har brug for gennemsigtighed, kan JPEG reducere filstørrelsen
Gennemsigtige pitfalls og fixer
- Den gennemsigtige baggrund tabt*Save med
PngOptions
JPEG understøtter ikke gennemsigtighed.
- Den gennemsigtige baggrund tabt*Save med
Part af billedet er forsvundet efter rotationBrug af
expandCanvas = true
at vokse kanvaserne, så det roterede indhold passer.Jagged edge efter rotationHvis din kilde er lav opløsning, overveje at genoprette indtægten til en højere resolution før rotering, så nedskala efter at spare for at reducere synlige artefakter.
Memorie og store billederPlacer billeder hurtigt og undgå at oplade mange store filer på én gang. Konfigurer disk caching til store partier, hvis det er nødvendigt.
Mini checkliste
- Ladet med
Image.Load
- Rotation med
image.Rotate(angle, true, Color.Transparent)
- Save med
new PngOptions()
For gennemsigtighed - Brug en solid baggrund, hvis gennemsigtighed ikke er nødvendig
- Validering af udkast visuelt for nøgleforretninger
FAQ
** Hvilke formater holder gennemsigtighed efter rotation**PNG og andre alfa-tilgængelige formater. JPEG bevarer ikke gennemsigtighed.
Hvordan kan jeg rotere uden at udvide kanvasenPass expandCanvas = false
Indhold uden for de oprindelige grænser vil blive klippet.
- Jeg kan rotere fra en hvilken som helst vinkel*Ja. Angleparameteren accepterer ethvert numerisk gradværdi.
More in this category
- Optimering af animerede GIF'er i .NET ved hjælp af Aspose.Imaging
- Optimerer Multi-Page TIFF'er for arkiver i .NET med Aspose
- Cropping produktbilleder til e-handelsplatforme ved hjælp af Aspose.Imaging for .NET
- Data-drevne animationer i .NET med Aspose.Imaging
- HEIC til JPEG/PNG Conversion med Aspose.Imaging for .NET