2010-04-22 13 views
9

System.Drawing.Color ma metodę ToArgb() do zwracania reprezentacji Int koloru.
W Silverlight, myślę, że musimy użyć System.Windows.Media.Color. Ma A, R, G, B, ale nie ma metody zwracania pojedynczej wartości.
Jak mogę zaimplementować ToArgb()? W System.Drawing.Color, ToArgb() stanowiImplementacja ToArgb()

return (int) this.Value; 

System.Windows.Media.Color ma metodę FromArgb (bajt A bajtów R bajt G bajt B). Jak rozłożyć wartość Int zwróconą przez ToArgb() w celu użycia z FromArgb()?

Dzięki za wszelkie wskazówki ...

Odpowiedz

30

Krótki i szybki. Bez dodatkowego wywołania metody, ale z szybkimi operacjami.

// To integer 
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B; 

// From integer 
Color color = Color.FromArgb((byte)(iCol >> 24), 
          (byte)(iCol >> 16), 
          (byte)(iCol >> 8), 
          (byte)(iCol)); 
+0

Wyniki w wyjątku OverflowException w VB.NET. 'CByte ((iCol >> 24) And & HFF)' działa. – mbomb007

5

Brzmi jak pytasz dwa pytania tutaj, pozwól mi zrobić kolejne ukłucie na niego. Niezależnie od tego będziesz chciał zajrzeć do klasy BitConverter.

Od this page:

Bajt zamawiania z 32-bitowym ARGB wartości jest AARRGGBB.

Tak, aby wdrożyć ToArgb(), można napisać extension method który robi coś takiego:

public static int ToArgb(this System.Windows.Media.Color color) 
{ 
    byte[] bytes = new byte[] { color.A, color.R, color.G, color.B }; 
    return BitConverter.ToInt32(bytes, 0); 
} 

I do "rozłożenia Int zwrócony przez ToArgb(), aby korzystać z FromArgb()", to może to zrobić:

byte[] bytes = BitConverter.GetBytes(myColor.ToArgb()); 
byte aVal = bytes[0]; 
byte rVal = bytes[1]; 
byte gVal = bytes[2]; 
byte bVal = bytes[3]; 

Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal); 

Mam nadzieję, że to pomoże.

+0

Bardzo pomocna, dziękuję. – Number8

+0

Myślę, że masz tablice do tyłu. 'Kolejność bajtów 32-bitowej wartości ARGB to AARRGGBB." Odnosi się do cyfr ośmiocyfrowego uint. W małym endianie (prawdopodobnie bardziej powszechnym przypadku) twój kod jest błędny, niebieski jest najważniejszy. – Zarat

+0

@Zarat, masz rację na chipy zgodne z Intel. BitConverter nie zmienia endionowości twojej kolejności bajtów, więc ten sam kod może mieć bajty uporządkowane inaczej, w zależności od kolejności endian. –

1

Wystarczy krótka notatka:

Odzyskiwanie reprezentację całkowitą obiektu „kolor” wydaje się być 4 razy szybciej dla mnie podczas wywoływania color.ToArgb() zamiast bezpośrednio za pomocą Bitshift-operacje w zaznaczona odpowiedź. Więc jeśli masz dostęp do .ToArgb(), zawsze używaj tego!

Twórca wątku stwierdził, że nie ma do niego dostępu, więc oczywiście zaznaczona odpowiedź jest nadal poprawna, juse nie daj się pomylić z deklarowanymi "szybkimi operacjami" w nim.

Pamiętaj: kolor instancji Kolor jest wewnętrznie zapisany jako wartość int, więc ToArgb() właśnie zwraca ją, uzyskując dostęp do każdego jej bajtu (według właściwości .A, .R., .G., .B), a następnie ponownie je złożyć przez przesunięcie bitów, porusza się w kółko.

+1

System.Windows.Media.Color nie ma metody ToArgb ani nie przechowuje koloru wewnętrznie jako int. Wygląda na to, że nie przeczytałeś tego pytania. – Zarat