سؤال

أعلم أن هذا لن ينقل بشكل مباشر لونا، فسيحصل عليه "يعارض ذلك". كنت أتساءل عما إذا كان أي شخص يعرف طريقة بسيطة (بضعة خطوط من التعليمات البرمجية) لعقل اللون من أي لون معين؟

في الوقت الحالي، لدي هذا (الذي ليس بالضبط تعريف المنفصل، لأنه إذا قمت بتمريره لون رمادي / رمادي، فسيعود شيئا مشابها للغاية، 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 Answer) وانقلب هوى، ولكن أيضا 2) تحقق مما إذا كان Hue لا يقترب من الوسط وإذا كان الأمر كذلك، فانتقل إلى الظلام تماما أو الظلام تماما.

إذا كنت ترغب في تغيير كل لون، فحاول دالة دورانية (التحول أو الإضافة) بدلا من وظيفة التقليب (إبطال). بمعنى آخر، فكر في حدود من 0 إلى 255 لكل لون واحد (أحمر، أخضر، أزرق) ملفوفة، متصلة في نصائح مثل دائرة القيم. ثم قم بتشغيل كل لون حول الدفعة عن طريق إضافة بعض القيمة والقيام MOD 256. على سبيل المثال، إذا كانت قيمة البداية الخاصة بك باللون الأحمر 255، وأنت تضيف 1، فستحصل على 0. إذا قمت بتشغيل جميع الألوان الثلاثة بحلول 128 عاما، فستحصل بشكل كبير القيم لكل لون الأصلي في الصورة، حتى الرمادي. الرمادي 127، 127، 127، 127 يصبح أبيض 255، 255، 255. رمادي 128، 128، 128 يصبح أسود 0، 0، هناك تأثير تصويري مثل تسميتها، اكتشفها حادث رجل راي في عام 1930.

يمكنك أيضا القيام بعمليات دورانية على كل لون (أحمر، أخضر، أزرق) بمقدار مختلف لفجيلات الصورة حقا.

يمكنك أيضا إجراء عمليات الدوران على HUE، وتحويلي من كل لون أصلي من خلال بعض المبلغ على دائرة Hue، مما يغير كل الألوان دون تغيير السطوع، وبالتالي فإن الظلال لا تزال تبدو وكأنها الظلال، مما يجعل الناس يشبهون سمبسون أو يصطدمون مثال.

يمكن أن يبدو رمز التحول بحلول 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