gpt4 book ai didi

c# - 如何在不失去透明度的情况下将图像转换为图标?

转载 作者:太空狗 更新时间:2023-10-29 18:20:10 25 4
gpt4 key购买 nike

我有 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;
}

这样做后我失去了透明度,alpha 透明图像没有按预期呈现....这可以解决吗?

最佳答案

不,还有很多。图标有一个非常复杂的内部结构,经过优化以在 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 图像上看到边缘透明的“边缘”的可能性。只有当图像以众所周知的背景颜色显示时,这才有效。根据设计,图标永远不能依赖它。专用图标编辑器始终是获得美观图标的唯一真正好方法。

关于c# - 如何在不失去透明度的情况下将图像转换为图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21387391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com