如何将两个图标合并在一起? (在另一个图标上叠加一个图标)

时间:2010-04-08 12:30:43

标签: c# image merge icons overlay

我有两个16x16 RGB / A .ICO图标文件,每个文件都加载到一个单独的System.Drawing.Icon对象中。

如何创建一个新的Icon对象,其中包含两个图标的合并(一个叠加在另一个图标的顶部)?


修改
我可能不太清楚,我不想将两个图像混合在一起,我想将一个图标叠加在另一个上面。

我应该补充说,图标已经包含透明部分,我不需要任何透明的“混合”来使两个图标都可见。我需要的是将一个图标的非透明像素覆盖在另一个图标的顶部。透明像素应该让背景图标显示出来。

例如,查看stackoverflow图标。它有一些灰色和橙色的区域,有些区域是完全透明的。想象一下,您想要在Firefox图标上叠加SO图标。你会看到SO图标的灰色和橙色为全彩色,而SO图标是透明的,你会看到Firefox图标的那些部分。

2 个答案:

答案 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()你的图标将它们作为图像对象进行拍摄。

Merged & Overlaid

    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);
    }