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)
编辑
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)
归档时间: |
|
查看次数: |
9168 次 |
最近记录: |