如何将图像转换为一个图标,而不会失去透明度?如何将图像转换为一个图标,而不会失去透明度?(How t

2019-05-12 10:15发布

我有我需要显示它之前转换为图标的PNG图像。

这是我做的:

public Icon ImageToIcon(Image imgTest)
{
    Bitmap bitmap = new Bitmap(imgTest);
    Icon icoTest;

    IntPtr iPtr = bitmap.GetHicon();
    icoTest = (Icon) Icon.FromHandle(iPtr).Clone();

    return icoTest;
}

我这样做后失去透明度,预计阿尔法透明图像不会呈现....可以这样解决了吗?

Answer 1:

不,还有很多更给它。 图标有一个相当复杂的内部结构,优化上世纪80年代的硬件合理工作。 图标图像有三个位图,一个是图标,一个单色位图,指示图像中的哪个部分是透明的,另一单色位图,指示部分是相反的。 生成的单色位图是非常痛苦的,.NET不支持他们。 也不Bitmap.GetHicon()做它的尝试。 你需要一个程序库来为你工作。

Vista中提出了一些救济,它开始支持包含PNG图像图标。 您会在自己的代码生成它有一个镜头。 像这样:

    public static Icon IconFromImage(Image img) {
        var ms = new System.IO.MemoryStream();
        var bw = new System.IO.BinaryWriter(ms);
        // Header
        bw.Write((short)0);   // 0 : reserved
        bw.Write((short)1);   // 2 : 1=ico, 2=cur
        bw.Write((short)1);   // 4 : number of images
        // Image directory
        var w = img.Width;
        if (w >= 256) w = 0;
        bw.Write((byte)w);    // 0 : width of image
        var h = img.Height;
        if (h >= 256) h = 0;
        bw.Write((byte)h);    // 1 : height of image
        bw.Write((byte)0);    // 2 : number of colors in palette
        bw.Write((byte)0);    // 3 : reserved
        bw.Write((short)0);   // 4 : number of color planes
        bw.Write((short)0);   // 6 : bits per pixel
        var sizeHere = ms.Position;
        bw.Write((int)0);     // 8 : image size
        var start = (int)ms.Position + 4;
        bw.Write(start);      // 12: offset of image data
        // Image data
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        var imageSize = (int)ms.Position - start;
        ms.Seek(sizeHere, System.IO.SeekOrigin.Begin);
        bw.Write(imageSize);
        ms.Seek(0, System.IO.SeekOrigin.Begin);

        // And load it
        return new Icon(ms);
    }

测试在.NET 4.5和Windows 8.1。 谨防“边缘”的可能性,你会在PNG图像看到在边缘上的透明度。 只有运作良好时,显示在一个著名的背景颜色的图像。 其中,由设计,图标可以永远依靠的人。 一个专门的图标编辑器总是会得到很好看的图标唯一真正好方法。



文章来源: How to convert an image to an icon without losing transparency?