2010-04-22 5 views
9

System.Drawing.Color에는 색상의 Int 표현을 반환하는 ToArgb() 메서드가 있습니다.
Silverlight에서는 System.Windows.Media.Color를 사용해야한다고 생각합니다. A, R, G, B 멤버가 있지만 단일 값을 반환하는 메서드는 없습니다.
어떻게 ToArgb()를 구현할 수 있습니까? System.Drawing.Color, ToArgb()에서ToArgb() 구현

return (int) this.Value; 

System.Windows.Media.Color 갖는 FromArgb (바이트 A, 바이트 R, G 바이트, 바이트 B) 구성 방법. FromArgb()와 함께 사용하도록 ToArgb()에서 반환 한 Int를 어떻게 분해합니까? 여기에 두 가지 질문을하는 것처럼

어떤 포인터를 주셔서 감사합니다 ...

답변

30

짧고 빠릅니다. 여분의 메소드 호출없이 빠른 조작.

// 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

VB.NET에서 OverflowException이 발생합니다. 'CByte ((iCol >> 24) And HFF)'가 작동합니다. – mbomb007

5

는 소리, 내가 그것을 다른 자상을 보자. 그럼에도 불구하고 BitConverter 클래스를 사용해 보길 원할 것입니다. this page 가입일

:

32 비트 ARGB 값의 바이트 순서 AARRGGBB이다. 당신은

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

그리고 "는 지능이 FromArgb()와 함께 사용할 ToArgb()에 의해 반환 분해"하기 :

그래서, ToArgb()을 구현하기 위해, 다음과 같이 않는 extension method을 쓸 수 이것을 할 수 있습니다 :

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

희망이 있습니다.

+0

매우 도움이됩니다. 감사합니다. – Number8

+0

나는 배열이 거꾸로 있다고 생각해. '32 비트 ARGB 값의 바이트 순서는 AARRGGBB입니다.'는 8 자리 16 진수의 숫자를 나타냅니다. 리틀 엔디안 (아마 더 일반적인 경우) 코드가 잘못되어, 파란색이 먼저옵니다. – Zarat

+0

@ 자랏, 인텔 호환 칩에 맞습니다. BitConverter는 바이트 순서의 엔디안을 변경하지 않으므로 같은 코드가 엔디안 순서에 따라 다르게 정렬 된 바이트를 가질 수 있습니다. –

1

조금만 참고 :

는 "색상"개체의 정수 표현을 가져 오는 color.ToArgb을 (호출) 대신 직접의 bitshift-운영에를 사용하는 경우 나 4 배 빠른 것 같다 표시된 대답. 따라서 .ToArgb()에 액세스 할 수 있으면 항상 사용하십시오!

스레드 작성자는 액세스 권한이 없다고 말했기 때문에 표시된 답변은 여전히 ​​정확하지만 juse는 주장하는 "빠른 작업"에 혼란을 느끼지 않습니다.

Color 인스턴스의 색상은 내부적으로 이미 int 값으로 저장되어 있으므로 ToArgb()는 반환하며 속성의 .A, .R, .G., .B) 그리고 비트 시프트 (bithifting)에 의해 그들을 다시 앙상블 (re-ensemble)하는 것은 원 안에 움직이는 것입니다.

+1

System.Windows.Media.Color에는 ToArgb 메서드가 없으며 색을 int로 내부적으로 저장하지도 않습니다. 당신이 그 질문을 읽지 않은 것 같아요. – Zarat