将 System.Drawing.Icon 转换为 SkiaSharp.SKBitmap

Convert System.Drawing.Icon to SkiaSharp.SKBitmap

我需要获取可执行文件的图标 SKBitmap 我已经知道如何获得可执行文件的图标,但我一直在寻找一种方法将 System.Drawing.Icon 转换为 SkiaSharp.SKBitmap,我正在处理的项目使用它来应用进一步的处理。我知道 Icon.toBitmap() 给我一个 System.Drawing.Bitmap,但我也不能转换它。

    Icon icon = Icon.ExtractAssociatedIcon(/*Path to FooBar.exe*/);
    SKBitmap skbm = /* what goes here ? */;
using System.Drawing;
using SkiaSharp;

/.../

Icon icon = Icon.ExtractAssociatedIcon(applicationPath);
SKBitmap skBitmap = icon.ToSKBitmap();

/... or (original answer) .../

Icon icon = Icon.ExtractAssociatedIcon(applicationPath);
SKBitmap skBitmap = icon.ToBitmap().ToSKBitmap();

/.../

namespace Vurdalakov
{
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using SkiaSharp;

    public static class BitmapExtensions
    {
        public static SKBitmap ToSKBitmap(this Bitmap bitmap)
        {
            using (var stream = new MemoryStream())
            {
                bitmap.Save(stream, ImageFormat.Png);

                stream.Seek(0, SeekOrigin.Begin);

                return SKBitmap.Decode(stream);
            }
        }

        public static SKBitmap ToSKBitmap(this Icon icon)
        {
            using (var stream = new MemoryStream())
            {
                icon.Save(stream);

                stream.Seek(0, SeekOrigin.Begin);

                return SKBitmap.Decode(stream);
            }
        }
    }
}

以下解决问题

using MemoryStream mem = new MemoryStream();
Icon.ExtractAssociatedIcon(ProgramLocation).Save(mem);
mem.Seek(0, SeekOrigin.Begin);
SKBitmap skbm = SKBitmap.Decode(mem);
mem.Close();