Fix svg rendering error #1430

This commit is contained in:
ema
2025-01-02 06:16:02 +08:00
parent fd60013d23
commit 57fb7c6a5f
4 changed files with 70 additions and 3 deletions

View File

@@ -30,11 +30,9 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using PixelFormat = System.Drawing.Imaging.PixelFormat;
using Size = System.Windows.Size;
namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers;

View File

@@ -0,0 +1,61 @@
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using SkiaSharp;
using Svg.Skia;
using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers;
internal class SvgProvider : ImageMagickProvider
{
public SvgProvider(Uri path, MetaProvider meta, ContextObject contextObject) : base(path, meta, contextObject)
{
}
public override Task<BitmapSource> GetRenderedFrame(int index)
{
return new Task<BitmapSource>(() =>
{
try
{
using var svg = new SKSvg();
if (svg.Load(Path.LocalPath) is SKPicture picture)
{
using var ms = new MemoryStream();
// Render the SVG picture to a bitmap
picture.ToImage(ms, SKColors.Empty, SKEncodedImageFormat.Png, 100, 1f, 1f, SKColorType.Rgba8888, SKAlphaType.Unpremul, null);
return BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}
catch (Exception e)
{
ProcessHelper.WriteLog(e.ToString());
}
// Fallback to basic one
return base.GetRenderedFrame();
});
}
}

View File

@@ -84,6 +84,9 @@ public class Plugin : IViewer
AnimatedImage.AnimatedImage.Providers.Add(
new KeyValuePair<string[], Type>([".cur", ".ani"],
typeof(CursorProvider)));
AnimatedImage.AnimatedImage.Providers.Add(
new KeyValuePair<string[], Type>([".svg"],
typeof(SvgProvider)));
AnimatedImage.AnimatedImage.Providers.Add(
new KeyValuePair<string[], Type>(["*"],
typeof(ImageMagickProvider)));

View File

@@ -55,7 +55,12 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="QuickLook.ImageGlass.WebP" Version="1.4.0" />
<PackageReference Include="QuickLook.ImageGlass.WebP" Version="1.4.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Svg.Skia" Version="2.0.0.4">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Magick.NET-Q8-AnyCPU" Version="14.2.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>