Объединить 2 цвета, чтобы сделать прозрачный овелап? - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть два System.Windows.Media.Color (a и b), и мне нужно получить a и поставить на b для имитации прозрачности . использовать в моем методе слияния:

public static Image Merge(Image a,Image b)
{

    for(int x=0;x < b.Width;x++ )
    {
        for (int y = 0; y < b.Height; y++)
        {
            a.SetPixel(x, y, b.GetPixel(x, y));
        }
    }
    return a;
}

Помогите Спасибо!

Решение:

        public static Image Merge(Image a,Image b)
        {

            for(int x=0;x < b.Width;x++ )
            {
                for (int y = 0; y < b.Height; y++)
                {
                    a.SetPixel(x, y, Mix(a.GetPixel(x, y), b.GetPixel(x, y), .5f));
                    //a.SetPixel(x, y,b.GetPixel(x, y));
                }
            }

            return a;
        }

        public static Color Mix(Color from, Color to, float percent)
        {
            float amountFrom = 1.0f - percent;

            return Color.FromArgb(
            (byte)(from.A * amountFrom + to.A * percent),
            (byte)(from.R * amountFrom + to.R * percent),
            (byte)(from.G * amountFrom + to.G * percent),
            (byte)(from.B * amountFrom + to.B * percent));
        }

Я обнаружил одну ошибку округления в методе Mix, решить при использовании Math.Round ():

общедоступная статическая цветовая смесь (цвет от, цвет до, процент с плавающей запятой) { значение с плавающей запятойFrom = 1,0f - проценты;

    return Color.FromArgb(
    (byte)Math.Round(from.A * amountFrom + to.A * percent),
    (byte)Math.Round(from.R * amountFrom + to.R * percent),
    (byte)Math.Round(from.G * amountFrom + to.G * percent),
    (byte)Math.Round(from.B * amountFrom + to.B * percent));
}

1 Ответ

4 голосов
/ 23 апреля 2010

Найдено эта статья с использованием следующего метода:

public static Color Mix(Color from, Color to, float percent)
{
    float amountFrom = 1.0f - percent;

    return Color.FromArgb(
    (int)(from.A * amountFrom + to.A * percent),
    (int)(from.R * amountFrom + to.R * percent),
    (int)(from.G * amountFrom + to.G * percent),
    (int)(from.B * amountFrom + to.B * percent));
}

Назовите это так:

a.SetPixel(x, y, Mix(a.GetPixel(x, y), b.GetPixel(x, y), .5f));

Возможно, вам придется немного поиграть с функцией (возможно, даже изменить ее), но я думаю, что она может дать вам именно тот результат, который вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...