将System.Drawing.Icon转换为byte []时,颜色深度正在消失

时间:2018-01-28 14:44:28

标签: c# winforms

我有一个逻辑

using (var ms = new MemoryStream())
{
    icon.ToBitmap();
    var array = ms.GetBuffer();
}

using (var ms = new MemoryStream(array))
{
    var icon = new Icon(ms);
}

我希望得到一个源图标,但是我得到一个错误颜色的图标。

Example

我该如何解决?

UPD 我有2种方法

    public static byte[] ToByteArray(this Icon icon)
    {
        using (var ms = new MemoryStream())
        {
            icon.Save(ms);
            return ms.GetBuffer();
        }
    }

    public static Icon ToIcon(byte[] bytes)
    {
        using (var ms = new MemoryStream(bytes))
        {
            return new Icon(ms);
        }
    }

MemoryStream.ToArray()也无法正常工作 icon.ToBitmap()返回黑色背景

UPD2:

    public static void Func()
    {
        Icon icon = System.Drawing.Icon.ExtractAssociatedIcon("filename");
        var iconBytes = icon.ToByteArray();
        //...... SOME LOGIC.......
        var restoredIcon = ToIcon(iconBytes);
        image.Source = restoredIcon.ToImageSource();
    }
    public static byte[] ToByteArray(this Icon icon)
    {
        using (var ms = new MemoryStream())
        {
            icon.Save(ms);
            return ms.GetBuffer();
        }
    }

    public static Icon ToIcon(byte[] bytes)
    {
        using (var ms = new MemoryStream(bytes))
        {
            return new Icon(ms);
        }
    }

    public static ImageSource ToImageSource(this Icon icon)
    {
        ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon(
            icon.Handle,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());

        return imageSource;
    }

1 个答案:

答案 0 :(得分:0)

Icon.ToBitmap根据此文档失去透明度:

https://msdn.microsoft.com/en-us/library/windows/apps/system.drawing.icon.tobitmap(v=vs.100).aspx/html

图标的透明区域在转换为位图时会丢失,并且生成的位图的透明色设置为RGB(13,11,12)。返回的位图与原始图标具有相同的高度和宽度。

试试这个,假设图像中没有颜色,在ToBitmap()之后,您可以调用一个语句使该颜色透明:

System.Drawing.Bitmap img = icon.ToBitmap();
img.MakeTransparent(Color.FromArgb(13, 11, 12));