2010-04-08 221 views
7

我有两个16x16 RGB/A .ICO图标文件,每个都加载到单独的System.Drawing.Icon对象中。如何将两个图标合并在一起? (覆盖另一个图标上的一个图标)

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


编辑
我可能不是太清楚,我不想两个图像融合到对方,我要叠加在另一个上面一个图标。

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

例如,查看stackoverflow图标。它有一些灰色和橙色的区域,以及一些完全透明的区域。想象一下,你想要覆盖Firefox图标顶部的SO图标。你会看到SO图标的灰色和橙色全彩,SO图标透明的地方,你会看到Firefox图标的那些部分。

+0

你只是想显示结果,或者实际上有另一个图标作为输出吗? – leppie 2010-04-08 12:34:48

+0

好吧,最后是我想要显示结果。但我已经有办法显示一个图标对象排序。因此,对我来说,覆盖这两个图标的最简单方法是制作一个新的Icon对象,并将其传递到我现有的系统中。 (我不需要创建一个新的.ico文件) – demoncodemonkey 2010-04-08 12:37:24

回答

16

这是我想出了最后的功能。这比我想象的要简单...
感谢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

这对我有效,但不是100%,我必须指定连续绘制两幅图像时的目标尺寸,否则会以原始尺寸绘制它们。例如:'canvas.DrawImage(a,new Rectangle(0,0,16,16));' – 2015-09-21 16:16:13

+0

@DavidCarrigan我猜这两幅图像都需要16x16,否则需要裁剪或调整大小。你的图片尺寸是多少? – demoncodemonkey 2015-09-21 20:32:53

+1

他们会有所不同,所以这真的是我不得不做的。几乎只是添加了System.Drawing.Size类型的另一个参数。然后引用该参数来创建位图并在将两个图像绘制到画布时指定目标大小。 – 2015-09-21 22:33:31

7

编辑

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

采取了一些代码here

诀窍是用透明度,使它们能够相互可以看到绘制每个图像。不是特定于图标,所以这应该适用于任何图像类型。你可以首先将你的图标设为ToBitmap(),将它们作为Image Objects afaik。

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

谢谢,这里几乎就有,但它并不像我期望的那样工作......在你的例子中,Output.png并没有清楚地显示任何一组线条。哪里有黑色的黑色,没关系,透明透明的地方也没关系。但是透明的黑色或反之亦然变成灰色。我期望它始终是坚实的黑色网格线。我试图改变透明度,但它没有帮助...任何想法? – demoncodemonkey 2010-04-09 13:28:28

+0

我会稍微更新答案... – 2010-04-09 15:59:34

+0

感谢您的帮助,事实证明它比我们两个人都想象得更简单:) – demoncodemonkey 2010-04-12 12:12:10

相关问题