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

dem*_*key 7 c# merge icons overlay image

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

你将如何创建一个Icon包含两个图标合并的新对象(一个重叠在另一个上面)?


编辑:
我可能不太清楚,我不想将两个图像混合在一起,我想将一个图标叠加在另一个上面.

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

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

dem*_*key 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());
}
Run Code Online (Sandbox Code Playgroud)


Eoi*_*ell 7

编辑

re:你的评论:对于初学者......我的形象不是黑色和透明的.它们是黑色和白色......两者都设置为0.6f(60%)不透明度,因此黑色为黑色(> 100%黑色)或白色为白色(> 100%白色)它看起来很好,但是对于重叠你将有60%的白色黑色混合,它给你灰色...你可以做的是创建2个单独的ImageAttributes并单独调整不透明度,看看你是否能得到预期的输出(见改变的代码).如果您的图像具有透明部分,则会有所不同.

这里拿了一些代码

诀窍是用透明度绘制每个图像,以便可以通过彼此看到它们.不是特定于图标,因此这适用于任何图像类型.您可以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);
    }
Run Code Online (Sandbox Code Playgroud)