2010-04-22 28 views
9

System.Drawing.Color, rengin Int temsilini döndürmek için bir ToArgb() yöntemine sahiptir.
Silverlight'ta, System.Windows.Media.Color'u kullanmamız gerektiğini düşünüyorum. A, R, G, B üyelerine sahiptir, ancak tek bir değer döndürecek yöntem yoktur.
ToArgb() öğesini nasıl uygularım? System.Drawing.Color, ToArgb() 'deUygulanması ToArgb()

return (int) this.Value; 

System.Windows.Media.Color sahip bir FromArgb (bayt A, bayt R, bayt G, bayt B) yöntemi oluşur. FromArgb() ile kullanılacak ToArgb() tarafından döndürülen Int'i nasıl ayrıştırabilirim? Burada iki soru soruyorsun gibi

herhangi işaretçiler için teşekkürler ...

cevap

30

Kısa ve hızlı. Ekstra bir yöntem çağrısı olmadan, ancak hızlı işlemlerle.

// 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'te bir OverflowException ile sonuçlar. CByte ((iCol >> 24) Ve & HFF) 'çalışmaları. – mbomb007

5

Sesler, bana bunu başka bir bıçak atalım. Yine de, BitConverter sınıfını kullanarak bakmak isteyeceksiniz. this page itibaren

:

32-bit ARGB değerin bayt sipariş AARRGGBB olduğunu. Eğer

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

Ve "Int FromArgb() ile kullanmak ToArgb() tarafından döndürülen ayrıştırmak" için:

Yani, ToArgb() uygulamak için, böyle bir şey yapar bir extension method yazabilirsiniz Bunu yapabilir:

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

Bu yardımcı olur umarım.

+0

Çok yardımcı, teşekkürler. – Number8

+0

Sanırım dizileri geriye aldınız. '32-bit ARGB değerinin bayt sırası AARRGGBB'dir. 'Bir 8-hex haneli uint rakamını ifade eder. Küçük endianda (muhtemelen daha yaygın olan durum) kodunuz yanlış, mavi önce gelir. – Zarat

+0

@Zarat, Intel uyumlu çipler için doğru. BitConverter, bayt sıranızın endiannesini değiştirmez, bu nedenle aynı kod, endian-sırasına bağlı olarak farklı şekilde sipariş edilen baytlara sahip olabilir. –

1

Sadece kısa bir not:

bir "Renk" nesnenin tamsayı temsilini alınıyor color.ToArgb (arama) yerine doğrudan bitshift-operasyonlarını içinde kullanırken benim için 4 kat daha hızlı gibi görünüyor işaretli cevap. Yani .ToArgb() öğesine erişiminiz varsa, her zaman bunu kullanın!

İş parçacığı yaratıcısı, ona erişemediğini belirtti, dolayısıyla işaretlenmiş yanıt hala doğru, juse, içinde iddia edilen "hızlı işlemler" ile karıştırılmıyor.

Sadece şunu aklınızda bulundurun: Renk örneğinin rengi dahili olarak int değeri olarak kaydedilir; bu nedenle ToArgb() her bir tekli baytına (özellikler .A, .R. .G., .B) ve sonra bitshifting ile onları yeniden birleştirmek bir daire içinde hareket ediyor.

+1

System.Windows.Media.Color, ne ToArgb yöntemine sahipse ne de dahili olarak bir int olarak saklar. Soruyu okumadığın görünüyor. – Zarat