문제

나는 이것이 색상을 직접 뒤집지 않는다는 것을 알고 있습니다. 단지 '반대'할 것입니다. 주어진 색상에서 색상을 반전시키는 간단한 방법 (몇 줄의 코드)을 알고 있는지 궁금하십니까?

현재 나는 이것을 가지고있다 (이것은 반전의 정의가 아닙니다. 회색 / 회색 색상을 통과하면 매우 유사한 것을 반환하기 때문에 127, 127, 127) : :

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
도움이 되었습니까?

해결책

색상을 "반전"하여 의미하는 바에 따라 다릅니다.

코드는 "음수"색상을 제공합니다.

시안의 붉은 색, 자주색의 녹색, 노란색 (등)을 찾고 있습니까? 그렇다면 RGB 색상을 HSV 모드 (찾을 수 있습니다 여기 변형을하기 위해).

그런 다음 색조 값을 반전해야합니다 (변경 Hue ~에 의해 360-Hue)) 및 RGB 모드로 다시 변환하십시오.

편집 : Alex Semeniuk가 언급 한 바와 같이 변경 Hue ~에 의해 (Hue + 180) % 360 더 나은 솔루션입니다 (색조를 반전하지는 않지만 색상 원에서 반대 색상을 찾습니다).

다른 팁

당신이 사용할 수있는 :

MyColor=Color.FromArgb(MyColor.ToArgb()^0xffffff);

그것은 mycolor를 뒤집습니다.

이 시도:

uint InvertColor(uint rgbaColor)
{
    return 0xFFFFFF00u ^ rgbaColor; // Assumes alpha is in the rightmost byte, change as needed
}

각 구성 요소의 비트를 별도로 반전시킵니다.

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

편집 : ~ 연산자는 바이트와 함께 작동하지 않으며 캐스트가 필요합니다.

당신이 이미 가지고있는 것은 RGB 인버트입니다. 색상을 분류하는 다른 방법이 있으므로 색상의 역수에 대한 다른 정의가 있습니다.

그러나 그것은 당신이 대조적 인 색상을 원할 것 같고, RGB (127, 127, 127)를 포함한 모든 색상에서 작동하는 간단한 반전이 없습니다.

필요한 것은 1) HSV 로의 전환 (Thibthibs 답변 참조)과 색조를 반전하지만 2) 색조가 중간에 가까이 있지 않아 완전히 밝거나 완전히 어두워 지는지 확인하십시오.

모든 색상을 변경하려면 뒤집는 기능 (반전) 대신 회전 기능 (이동 또는 추가)을 시도하십시오. 다시 말해, 각 단일 색상 (빨간색, 녹색 및 파란색)에 대해 0 ~ 255의 범위를 랩핑하여 값의 원과 같은 팁으로 연결하십시오. 그런 다음 약간의 값을 추가하고 모드 256을 수행하여 원 주위의 각 색상을 이동합니다. 예를 들어, 빨간색의 시작 값이 255이고 1을 추가하면 0이됩니다. 그림의 모든 원래 색상, 심지어 회색까지 값. 그레이 127, 127, 127은 흰색 255, 255, 255가됩니다. 그레이 128, 128, 128은 검은 0, 0, 0이됩니다.

또한 그림을 엉망으로 만들기 위해 각 색상 (빨간색, 녹색, 파란색)에서 회전 작업을 수행 할 수 있습니다.

또한 색조에서 회전 작업을 수행하여 모든 원래 색상의 색조를 색조 원의 양으로 이동하여 밝기를 변경하지 않고 모든 색상을 변경하여 그림자가 여전히 그림자처럼 보이고 사람들이 Simpsons 또는 Smurphs처럼 보이게합니다. 예시.

128의 전환 코드는 다음과 같습니다.

public static Color Invert(this Color c) => Color.FromArgb(c.R.Invert(), c.G.Invert(), c.B.Invert());

public static byte Invert(this byte b) {
    unchecked {
        return (byte)(b + 128);
    }
}

내가 트리플 12x뿐만 아니라 혼합 값을 갖는 가장 단순하고 게으른 방법은 다음과 같습니다.

Color invertedColor= Color.FromArgb(fromColor.ToArgb() ^ 0xffffff);

if (invertedColor.R > 110 && invertedColor.R < 150 &&
    invertedColor.G > 110 && invertedColor.G < 150 &&
    invertedColor.B > 110 && invertedColor.B < 150)
{
    int avg = (invertedColor.R + invertedColor.G + invertedColor.B) / 3;
    avg = avg > 128 ? 200 : 60;
    invertedColor= Color.FromArgb(avg, avg, avg);
}

지금, invertedColor 128, 128, 128 또는 색상 값에 가까운 경우에도 원본의 색상이 다릅니다.

vb.net에 대한이 간단한 기능을 만들었습니다.

Public Shared Function Invert(ByVal Culoare As Color) As Color
    Return Color.FromArgb(Culoare.ToArgb() Xor &HFFFFFF)
End Function

그리고 이것은 C#에 대한 것 :

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top