我有两个16x16 RGB / A .ICO图标文件,每个文件都加载到一个单独的System.Drawing.Icon
对象中。
如何创建一个新的Icon
对象,其中包含两个图标的合并(一个叠加在另一个图标的顶部)?
修改:
我可能不太清楚,我不想将两个图像混合在一起,我想将一个图标叠加在另一个上面。
我应该补充说,图标已经包含透明部分,我不需要任何透明的“混合”来使两个图标都可见。我需要的是将一个图标的非透明像素覆盖在另一个图标的顶部。透明像素应该让背景图标显示出来。
例如,查看stackoverflow图标。它有一些灰色和橙色的区域,有些区域是完全透明的。想象一下,您想要在Firefox图标上叠加SO图标。你会看到SO图标的灰色和橙色为全彩色,而SO图标是透明的,你会看到Firefox图标的那些部分。
答案 0 :(得分:17)
这是我提出的最终功能。它比我想象的要简单...
感谢Eoin Campbell的辛勤工作。
public Icon AddIconOverlay(Icon originalIcon, Icon overlay)
{
Image a = originalIcon.ToBitmap();
Image b = overlay.ToBitmap();
Bitmap bitmap = new Bitmap(16, 16);
Graphics canvas = Graphics.FromImage(bitmap);
canvas.DrawImage(a, new Point(0, 0));
canvas.DrawImage(b, new Point(0, 0));
canvas.Save();
return Icon.FromHandle(bitmap.GetHicon());
}
答案 1 :(得分:7)
修改强>
重新:你的评论:对于初学者......我的形象不是黑色&透明。它们是黑色和白色......两者都设置为0.6f(60%)不透明度,因此黑色为黑色(> 100%黑色)或白色为白色(> 100%白色)它看起来很好,但对于重叠你将有60%的白色黑色混合,它给你灰色...你可以做的是创建2个单独的ImageAttributes并单独调整不透明度,看看你是否可以得到预期的输出(见改变代码)。如果你的图像有透明的部分,它会有所不同。
从here
获取了一些代码诀窍是用透明度绘制每个图像,以便可以通过彼此看到它们。不是特定于图标,因此这适用于任何图像类型。你可以先ToBitmap()
你的图标将它们作为图像对象进行拍摄。
using(Image a = Image.FromFile("1.png"))
using(Image b = Image.FromFile("2.png"))
using (var bitmap = new Bitmap(200, 200))
using (var canvas = Graphics.FromImage(bitmap))
{
Rectangle r = new Rectangle(new Point(0, 0), new Size(200, 200));
ColorMatrix cmxPic = new ColorMatrix();
cmxPic.Matrix33 = 1.0f;
ImageAttributes iaPic = new ImageAttributes();
iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
ColorMatrix cmxPic2 = new ColorMatrix();
cmxPic2.Matrix33 = 0.5f;
ImageAttributes iaPic2 = new ImageAttributes();
iaPic2.SetColorMatrix(cmxPic2, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.DrawImage(a, r, 0, 0, 200, 200, GraphicsUnit.Pixel, iaPic);
canvas.DrawImage(b, r, 0, 0, 200, 200, GraphicsUnit.Pixel, iaPic2);
canvas.Save();
bitmap.Save("output.png", ImageFormat.Png);
}