首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图标转换为Png

将图标转换为Png
EN

Stack Overflow用户
提问于 2016-10-10 12:25:14
回答 2查看 1.3K关注 0票数 3

我使用以下代码(基于我在另一个答案中找到的内容)将图像(通常是添加到项目资源中的PNG )转换为图标,以便在表单标题等中使用。

代码语言:javascript
复制
public static Icon IconFromImage(Image img)
{
    using (var bmp = new Bitmap(img))
    {
        Byte[] ba;
        using (var ms = new MemoryStream())
        {
            bmp.Save(ms, ImageFormat.Png);
            ms.Seek(0, SeekOrigin.Begin);
            ba = ms.ToArray();
        }

        using (var imgData = new MemoryStream())
        using (var writer = new BinaryWriter(imgData))
        {
            if (writer != null)
            {
                //Header (6 bytes)
                writer.Write((Byte)0);              // 0 reserved: set to 0
                writer.Write((Byte)0);              // 1 reserved: set to 0
                writer.Write((Int16)1);             // 2-3 image type: 1 = icon, 2 = cursor
                writer.Write((Int16)1);             // 4-5 number of images

                //Image entry #1 (16 bytes)
                writer.Write((Byte)bmp.Width);      // 0 image width
                writer.Write((Byte)bmp.Height);     // 1 image height
                writer.Write((Byte)0);              // 2 number of colors
                writer.Write((Byte)0);              // 3 reserved
                writer.Write((Int16)0);             // 4-5 color planes
                writer.Write((Int16)32);            // 6-7 bits per pixel
                writer.Write(ba.Length);            // 8-11 size of image data
                writer.Write(6 + 16);               // 12-15 offset to image data

                //Write image data
                writer.Write(ba);                   // PNG data must contain the whole PNG data file!

                writer.Flush();
                writer.Seek(0, SeekOrigin.Begin);

                return new Icon(imgData,16,16);
            }
        }
    }
    return null;
}

从图像到图标都很好。但是有一个例子,我需要抓住那个表单的标题图标,并从中得到一个图像。当我在标题图像中使用实际的基于文件的ICO文件时,这曾经是有效的,但是现在我使用转换代码来获取表单的图标,由此产生的PNGs看起来很可怕。

表格标题图标:

使用Bitmap.FromHicon(new Icon(theForm.Icon, new Size(16, 16)).Handle)呈现的图像:(注意:过去使用theForm.Icon.ToBitmap(),但现在出现错误)

我在另一篇文章中看到一条评论,其中一位用户表示,如果使用PNG来派生图标,那么恢复图像将是不好的,“因为PNG具有多点透明度”。如果这是我正在经历的问题,那我该怎么办呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-10 16:18:46

您可以使用IconBitmapDecoder获取保持像素格式的图标流,使用PngBitmapEncoder将该流保存在png图像中:

代码语言:javascript
复制
using System.Drawing;
using System.Windows.Media.Imaging;
class IconHelper
{
    public static Bitmap PngFromIcon(Icon icon)
    {
        Bitmap png = null;
        using (var iconStream = new System.IO.MemoryStream())
        {
            icon.Save(iconStream);
            var decoder = new IconBitmapDecoder(iconStream,
                BitmapCreateOptions.PreservePixelFormat,
                BitmapCacheOption.None);

            using (var pngSteam = new System.IO.MemoryStream())
            {
                var encoder = new PngBitmapEncoder();
                encoder.Frames.Add(decoder.Frames[0]);
                encoder.Save(pngSteam);
                png = (Bitmap)Bitmap.FromStream(pngSteam);
            }
        }
        return png;
    }
}

要使用这些类,需要添加对PresentationCoreWindowsBaseSystem.Xaml的引用。然后使用如下:

代码语言:javascript
复制
this.pictureBox1.Image = IconHelper.PngFromIcon(this.Icon);

结果与您用来创建图标的原始png相同。

票数 3
EN

Stack Overflow用户

发布于 2016-10-10 13:34:46

尝试Bitmap.FromHicon(this.Icon.Handle),您可能会得到更好的结果。至少,如果png有压缩,ToBitmap()似乎会阻塞:Displaying an icon in a pictureboxhttp://community.sharpdevelop.net/forums/t/21851.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39958247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档