2009-07-22 21 views
28

Bunun doğrudan bir rengi tersine çeviremeyeceğini biliyorum, sadece 'buna karşı çıkacak'. Herhangi bir renkten bir rengi tersine çevirmek için basit bir yolun (birkaç satır kod) tanımadığını merak ediyordum? Şu anda Renk/rengi nasıl tersine çevirebilirim?

Ben bu (ki bir invert değil tam tanımı, ben ona gri/gri renk geçirirseniz o mesela 127, 127, 127 derece benzer bir şey dönecektir çünkü):

const int RGBMAX = 255; 

Color InvertMeAColour(Color ColourToInvert) 
{ 
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
     RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B); 
} 
+8

Aslında, bu * * bir rengi tersine çevirmenin genellikle tanımlandığı şekilde ... bunun yerine ne arıyorsunuz? –

+0

Renkim 127, 127, 127 olursa, fonksiyonumdan geçersem onu ​​tersine çevirmez .. – ThePower

+1

Belki de verdiğiniz rengin okunabileceği bir arka plan rengi oluşturmalısınız? –

cevap

41

.

Mavi, mavi, mavi ve yeşil renklerde mavi kırmızı, mavi mi arıyorsunuz? Eğer öyleyse, RGB renginizi HSV modunda dönüştürmeniz gerekir (dönüşümü yapmak için here'u bulacaksınız).

Ardından Ton değerini tersine çevirmeniz yeterlidir (Hue değerini 360-Hue) ve tekrar RGB moduna dönüştürün.

DÜZENLEME: Alex Semeniuk sözü var gibi (Hue + 180) % 360 tarafından Hue daha iyi bir çözüm (o Hue ters ama renk çemberin üzerinde zıt rengi bulmazsa)

+0

yup, nihayet anlamlı bir cevap. Soruyu gerçekten doğru çözümle yanıtlamak için +1 – jalf

+1

+1 (gönderdiğim koda alternatif sunmak yerine) – ThePower

+0

Bunu bir araya getirerek http://stackoverflow.com/questions/2942/hsl-in-net/2504318 # 2504318 tam olarak ne ile gittiğimi. Teşekkürler! – Yoopergeek

10

Bu deneyin: her bileşenin

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

C# ile aynı şekilde yapılır. Sözdizimi tam olarak aynıdır. 0xFFFFFFFF^renk –

+0

Neredeyse aynı. :) Sadece küçük değişiklikleri C# haline getirdim. – Noldorin

+3

Bu, – Eyal

4

ters çevirme biti ayrı:

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

DÜZENLEME: ~ operatör otomatik olarak bayt ile çalışmaz, döküm gereklidir.

Size

Kodunuz bir "negatif" rengini sağlayan bir renk "ters çevirerek" demek istiyorsunuz bağlıdır

+0

Bu bir istisna atar (ArgumentException "-129" Değeri 'kırmızı' için geçerli değil ") – ThePower

+0

Evet, bir, düzeltilmiş cevap cevapsız. –

+0

Şimdi daha iyi düzenlenmişti, yine de bir invert değil, negatif olmakla ilgili işlevimle aynı şeyleri yapıyor. Yine de cevabınız için teşekkürler :-) – ThePower

4

Ne Sahip olduğunuz bir RGB- olduğunu değişiyor ters çevirin. Renklerin Sınıflandırılması için başka yollar ve dolayısıyla Renklerin Tersi için diğer tanımlamalar vardır.

Belki de kontrastlı bir Renk istediğiniz gibi geliyor ve RGB dahil tüm renkler için işe yarayacak basit bir Inversion yok (127, 127, 127).

İhtiyacınız olan şey 1) HSV'ye dönüştürme (ThibThibs yanıtına bakın) ve Tonu ters çevirin, ayrıca 2) Tonun ortaya yakınlaşıp kapanmadığını kontrol edin ve eğer tamamen ya parlak mı yoksa tamamen mi karanlık.

+1

Sabit nokta teoremi, (gerçek değerli) Renkli'den Renkli'ye herhangi bir sürekli fonksiyonun bir değeri değiştirmeyeceğini ima eder, eğer işlev makul bir şekilde pürüzsüzse, o zaman bu nokta etrafındaki bir yama çok fazla hareket etmeyecektir. Yani, –

14

Sen kullanabilirsiniz:

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

O MyColor tersine çevirir.

+6

bu ne için gri yapar? 127, 127, 127? – ThePower

+1

Biraz daha açık gri verir: 128, 128, 128 – Jerther

+1

Bence bu pek çok vaka için çok iyi bir cevaptır.Örneğin kırmızı siyanete dönüştürülür. Remy'nin kodunun vbnet eşdeğeri: 'MyColor = Color.FromArgb (MyColor.ToArgb() Xor & Hffffff) – Alex

3

Her rengi değiştirmek isterseniz, saygısız bir işlev yerine (döndürme) bir döndürme işlevini (kaydırma veya ekleme) deneyin. Diğer bir deyişle, sarılacak her bir renk için (kırmızı, yeşil ve mavi) 0 ile 255 arasındaki bir aralığı göz önünde bulundurun, değerler çemberi gibi uçlara bağlanır. Daha sonra, bir değer ekleyerek ve mod 256 yaparak her bir rengi çevirin. Örneğin, kırmızı için başlangıç ​​değeriniz 255 ise ve 1'i eklerseniz, 0 elde edersiniz. Eğer üç rengi de 128 olarak değiştirirseniz, önemli ölçüde farklılaşırsınız. Resimdeki her orijinal renk için değerler, hatta griler. Gri 127, 127, 127 beyaz 255, 255, 255 olur. Gri 128, 128, 128 siyah 0, 0, 0 olur. 1930'larda Man Ray tarafından tesadüfen keşfedilen Solarizasyon adı verilen fotoğrafik bir etki vardır.

Ayrıca, bir resmi karışıklığa uğratmak için her bir renkte (kırmızı, yeşil, mavi) farklı işlemlerle rotasyonel işlemler yapabilirsiniz. Ayrıca, her orijinal rengin tonunu, parlaklığı değiştirmeden tüm renkleri değiştiren renk tonu döngüsünde bir miktar değiştirerek renk tonu işlemlerini gerçekleştirebilirsiniz, böylece gölgeler gölgeler gibi görünür, böylece insanlar Örneğin Simpsons veya Şirinler.

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); 
    } 
} 
1

en basit ve tembel yolu ben sadece üçlü 12x sahip çalışmak için yapılmış, ancak karışık değerler şudur ki::

, 128 ile bir vardiya için kod gibi görünebilir

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); 
} 

Şimdi, invertedColor, 128, 128, 128 veya buna yakın bir renk değerine sahip olsa bile orijinalin farklı bir rengine sahiptir.