Я имею два 16x16 RGB/A.ICO файлы значков, каждый загруженный в отдельное System.Drawing.Icon
объект.
Как Вы создали бы новое Icon
объект, содержащий слияние этих двух значков (один наложенный сверху другого)?
Править:
Я, вероятно, был не слишком ясен, я не хочу смешивать два изображения друг в друга, я хочу наложить один значок сверху другого.
Я должен добавить, что значки уже содержат прозрачные части, и мне не нужно никакое прозрачное "смешивание" для создания обоих значков видимыми. То, в чем я нуждаюсь, должно наложить непрозрачные пиксели одного значка поверх другого значка. Прозрачные пиксели должны пропустить шоу фонового значка.
Например, посмотрите на stackoverflow значок. Это имеет некоторые области, которые являются серыми и оранжевыми, и некоторые области, которые полностью прозрачны. Предположите, что Вы хотите наложить значок SO сверху значка Firefox. Вы видели бы оттенки серого и апельсины значка SO в насыщенном цвете, и где значок SO прозрачен, Вы видели бы те части значка Firefox.
Вот последняя функция, которую я придумал. Это было проще, чем я думал ...
Спасибо Эоину Кэмпбеллу за тяжелую работу.
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());
}
РЕДАКТИРОВАТЬ
re: ваш комментарий: Для начала ... мое изображение не является черным и прозрачным. Они черно-белые ... оба имеют непрозрачность 0,6f (60%), поэтому там, где есть черный на черном (> 100% черный) или белый на белом (> 100% белый), это выглядит нормально, но для перекрытий у вас будет 60% белый черный микс, который дает вам серый цвет ... что вы можете сделать, это создать 2 отдельных атрибута ImageAttribute и отдельно настроить непрозрачность, чтобы увидеть, можете ли вы получить ожидаемый результат (см. измененный код). По-другому будет, если на ваших изображениях есть прозрачные участки.
взял некоторый код из здесь
Уловка состоит в том, чтобы нарисовать каждое изображение с прозрачностью, чтобы их можно было видеть друг через друга. Не относится к иконкам, так что это должно работать для любого типа изображения. Вы можете ToBitmap ()
сначала свои значки, чтобы получить их как объекты изображения afaik.
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);
}