Как объединить две иконки вместе? (наложить один значок поверх другого) - PullRequest
7 голосов
/ 08 апреля 2010

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

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


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

Я должен добавить, что значки уже содержат прозрачные части, и мне не нужно прозрачное «смешивание», чтобы сделать обе иконки видимыми. Мне нужно наложить непрозрачные пиксели одного значка поверх другого значка. Прозрачные пиксели должны пропустить фоновый значок.

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

Ответы [ 2 ]

17 голосов
/ 09 апреля 2010

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

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());
}
7 голосов
/ 08 апреля 2010

EDIT

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

взял код из здесь

Хитрость заключается в том, чтобы рисовать каждое изображение с прозрачностью, чтобы его можно было видеть сквозь друг друга. Не относится к иконкам, поэтому это должно работать для любого типа изображения. Вы можете 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);
    }
...