Как объединить два значка вместе? (наложите один значок сверху другого),

Я имею два 16x16 RGB/A.ICO файлы значков, каждый загруженный в отдельное System.Drawing.Icon объект.

Как Вы создали бы новое Icon объект, содержащий слияние этих двух значков (один наложенный сверху другого)?


Править:
Я, вероятно, был не слишком ясен, я не хочу смешивать два изображения друг в друга, я хочу наложить один значок сверху другого.

Я должен добавить, что значки уже содержат прозрачные части, и мне не нужно никакое прозрачное "смешивание" для создания обоих значков видимыми. То, в чем я нуждаюсь, должно наложить непрозрачные пиксели одного значка поверх другого значка. Прозрачные пиксели должны пропустить шоу фонового значка.

Например, посмотрите на stackoverflow значок. Это имеет некоторые области, которые являются серыми и оранжевыми, и некоторые области, которые полностью прозрачны. Предположите, что Вы хотите наложить значок SO сверху значка Firefox. Вы видели бы оттенки серого и апельсины значка SO в насыщенном цвете, и где значок SO прозрачен, Вы видели бы те части значка Firefox.

7
задан demoncodemonkey 9 April 2010 в 15:56
поделиться

2 ответа

Вот последняя функция, которую я придумал. Это было проще, чем я думал ...
Спасибо Эоину Кэмпбеллу за тяжелую работу.

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());
}
17
ответ дан 6 December 2019 в 07:25
поделиться

РЕДАКТИРОВАТЬ

re: ваш комментарий: Для начала ... мое изображение не является черным и прозрачным. Они черно-белые ... оба имеют непрозрачность 0,6f (60%), поэтому там, где есть черный на черном (> 100% черный) или белый на белом (> 100% белый), это выглядит нормально, но для перекрытий у вас будет 60% белый черный микс, который дает вам серый цвет ... что вы можете сделать, это создать 2 отдельных атрибута ImageAttribute и отдельно настроить непрозрачность, чтобы увидеть, можете ли вы получить ожидаемый результат (см. измененный код). По-другому будет, если на ваших изображениях есть прозрачные участки.

взял некоторый код из здесь

Уловка состоит в том, чтобы нарисовать каждое изображение с прозрачностью, чтобы их можно было видеть друг через друга. Не относится к иконкам, так что это должно работать для любого типа изображения. Вы можете ToBitmap () сначала свои значки, чтобы получить их как объекты изображения 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);
    }
7
ответ дан 6 December 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: