簡體   English   中英

實現ToArgb()

[英]Implementing ToArgb()

System.Drawing.Color具有ToArgb()方法以返回顏色的Int表示形式。
在Silverlight中,我認為我們必須使用System.Windows.Media.Color。 它具有A,R,G,B成員,但是沒有返回單個值的方法。
如何實現ToArgb()? 在System.Drawing.Color中,ToArgb()由

return (int) this.Value;  

System.Windows.Media.Color具有FromArgb(字節A,字節R,字節G,字節B)方法。 如何分解ToArgb()返回的Int與FromArgb()一起使用?

感謝您的指導...

簡短而快速。 無需額外的方法調用,但操作快速。

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

聽起來您在這里問了兩個問題,讓我再試一下。 無論如何,您都需要研究使用BitConverter類。

從此頁面

32位ARGB值的字節順序為AARRGGBB。

因此,要實現ToArgb() ,您可以編寫一個擴展方法 ,該方法可以執行以下操作:

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

並“分解由ToArgb()返回的Int以與FromArgb()一起使用”,您可以這樣做:

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

希望這可以幫助。

請注意:

對我來說,直接調用color.ToArgb()而不是在標記的答案中使用bitshift-運算時,檢索“ Color”對象的整數表示似乎快4倍。 因此,如果您可以訪問.ToArgb(),請始終使用它!

線程創建者表示他無法訪問它,因此標記的答案當然仍然是正確的,請不要為其中的聲明的“快速操作”感到困惑。

請記住:Color實例的顏色已經在內部保存為int值,因此ToArgb()僅在返回它的同時返回它(通過屬性.A,.R。,。G。, .B),然后通過移位將它們重新組合在一起,這有點像繞圈了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM