diff options
| author | Bond-009 <bond.009@outlook.com> | 2024-03-03 07:59:22 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-03 07:59:22 -0500 |
| commit | 3bd1a5c5574d2a0c1bc1b8d9384c1c7c900ac206 (patch) | |
| tree | dc8188f27067e72069ed5e41d500e82d10ef8282 /src | |
| parent | 35df0486f5217eef1bbc126bde036dab6759dfbf (diff) | |
| parent | c47bfb99bbff9f6b6cd847ba3b786936d59aa0dd (diff) | |
Merge pull request #11077 from crobibero/svg-to-image
Add support for converting from svg to other image types
Diffstat (limited to 'src')
| -rw-r--r-- | src/Jellyfin.Drawing.Skia/SkiaEncoder.cs | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs b/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs index 4ae5a9a48..a40719499 100644 --- a/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs +++ b/src/Jellyfin.Drawing.Skia/SkiaEncoder.cs @@ -19,8 +19,8 @@ namespace Jellyfin.Drawing.Skia; /// </summary> public class SkiaEncoder : IImageEncoder { + private const string SvgFormat = "svg"; private static readonly HashSet<string> _transparentImageTypes = new(StringComparer.OrdinalIgnoreCase) { ".png", ".gif", ".webp" }; - private readonly ILogger<SkiaEncoder> _logger; private readonly IApplicationPaths _appPaths; private static readonly SKImageFilter _imageFilter; @@ -89,12 +89,13 @@ public class SkiaEncoder : IImageEncoder // working on windows at least "cr2", "nef", - "arw" + "arw", + SvgFormat }; /// <inheritdoc/> public IReadOnlyCollection<ImageFormat> SupportedOutputFormats - => new HashSet<ImageFormat> { ImageFormat.Webp, ImageFormat.Jpg, ImageFormat.Png }; + => new HashSet<ImageFormat> { ImageFormat.Webp, ImageFormat.Jpg, ImageFormat.Png, ImageFormat.Svg }; /// <summary> /// Check if the native lib is available. @@ -312,6 +313,31 @@ public class SkiaEncoder : IImageEncoder return Decode(path, false, orientation, out _); } + private SKBitmap? GetBitmapFromSvg(string path) + { + if (!File.Exists(path)) + { + throw new FileNotFoundException("File not found", path); + } + + using var svg = SKSvg.CreateFromFile(path); + if (svg.Drawable is null) + { + return null; + } + + var width = (int)Math.Round(svg.Drawable.Bounds.Width); + var height = (int)Math.Round(svg.Drawable.Bounds.Height); + + var bitmap = new SKBitmap(width, height); + using var canvas = new SKCanvas(bitmap); + canvas.DrawPicture(svg.Picture); + canvas.Flush(); + canvas.Save(); + + return bitmap; + } + private SKBitmap OrientImage(SKBitmap bitmap, SKEncodedOrigin origin) { var needsFlip = origin is SKEncodedOrigin.LeftBottom or SKEncodedOrigin.LeftTop or SKEncodedOrigin.RightBottom or SKEncodedOrigin.RightTop; @@ -402,6 +428,12 @@ public class SkiaEncoder : IImageEncoder return inputPath; } + if (outputFormat == ImageFormat.Svg + && !inputFormat.Equals(SvgFormat, StringComparison.OrdinalIgnoreCase)) + { + throw new ArgumentException($"Requested svg output from {inputFormat} input"); + } + var skiaOutputFormat = GetImageFormat(outputFormat); var hasBackgroundColor = !string.IsNullOrWhiteSpace(options.BackgroundColor); @@ -409,7 +441,10 @@ public class SkiaEncoder : IImageEncoder var blur = options.Blur ?? 0; var hasIndicator = options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0); - using var bitmap = GetBitmap(inputPath, autoOrient, orientation); + using var bitmap = inputFormat.Equals(SvgFormat, StringComparison.OrdinalIgnoreCase) + ? GetBitmapFromSvg(inputPath) + : GetBitmap(inputPath, autoOrient, orientation); + if (bitmap is null) { throw new InvalidDataException($"Skia unable to read image {inputPath}"); |
