Как я инвертирую цвет?

Я создал Пользователя SQL Server Определенная Функция для вычисления чьего-то возраста, учитывая их дату рождения. Это полезно при необходимости в нем как в части запроса:

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlInt32 CalculateAge(string strBirthDate)
    {
        DateTime dtBirthDate = new DateTime();
        dtBirthDate = Convert.ToDateTime(strBirthDate);
        DateTime dtToday = DateTime.Now;

        // get the difference in years
        int years = dtToday.Year - dtBirthDate.Year;

        // subtract another year if we're before the
        // birth day in the current year
        if (dtToday.Month < dtBirthDate.Month || (dtToday.Month == dtBirthDate.Month && dtToday.Day < dtBirthDate.Day))
            years=years-1;

        int intCustomerAge = years;
        return intCustomerAge;
    }
};
39
задан Flip 11 July 2018 в 06:52
поделиться

4 ответа

Это зависит от того, что вы подразумеваете под «инвертированием» цвета

Ваш код предоставляет «отрицательный» цвет.

Вы хотите преобразовать красный в голубой, зеленый в пурпурный , синий в желтом (и так далее)? Если это так, вам нужно преобразовать цвет RGB в режим HSV (вы найдете здесь , чтобы выполнить преобразование).

Затем вам просто нужно инвертировать значение Hue (изменить Оттенок от 360-оттенок ) и преобразовать обратно в режим RGB.

РЕДАКТИРОВАТЬ: как упомянул Алекс Семенюк, изменив Оттенок на (Оттенок + 180)% 360 - лучшее решение (оно не инвертирует оттенок, а находит противоположный цвет на цветовом круге)

47
ответ дан 27 November 2019 в 02:17
поделиться

Попробуйте следующее:

uint InvertColor(uint rgbaColor)
{
    return 0xFFFFFF00u ^ rgbaColor; // Assumes alpha is in the rightmost byte, change as needed
}
11
ответ дан 27 November 2019 в 02:17
поделиться

Инвертируйте биты каждого компонента отдельно:

Color InvertMeAColour(Color ColourToInvert)
{
   return Color.FromArgb((byte)~ColourToInvert.R, (byte)~ColourToInvert.G, (byte)~ColourToInvert.B);
}

РЕДАКТИРОВАТЬ: оператор ~ не работает с байтами автоматически, требуется приведение.

5
ответ дан 27 November 2019 в 02:17
поделиться

У вас уже есть RGB-Invert. Есть другие способы классификации цветов и, следовательно, другие определения инверсии цвета.

Но похоже, что, возможно, вам нужен контрастный цвет, и нет простой инверсии, которая работала бы для всех цветов, включая RGB (127, 127, 127).

Что вам нужно, это 1) преобразование в HSV (см. Ответ ThibThibs) и инвертирование оттенка, но также 2) проверить, не соответствует ли оттенок t ближе к середине, и если да, то переходите к полностью яркому или полностью темному.

5
ответ дан 27 November 2019 в 02:17
поделиться
Другие вопросы по тегам:

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