2017-04-04 66 views
1

所以我創建了一個PS2遊戲的編輯器。 而這個遊戲有兩個「系統」的顏色。C#如何將colorDialog值發送到5bitRGB中的文本框?

「正常」 RGB R:0〜255 G:0到255 B:0〜255

而或我認爲是5bitRGB R:0〜31 G:0〜31 B:0 31.

又使在遊戲中的顏色變化, 我所選擇的值轉換在 ColorDialog類在十六進制例如:R:255 G:176 B:15 以十六進制表示FFB00F。

然後稍後通過十六進制在3個字節的「插槽」中更改這些值。

目前爲止美女很好,但5bitRGB只有2個字節的「插槽」。

示例:5bitRGB R:31 G:0 B:0在Hex 1F80中。

而這正是我不知道該怎麼做的原因,因爲我可以用十六進制的值將文本框中的值發送到正常的RGB 。

然後我通過十六進制將這些值textBox保存在3個字節的「槽」中。

同時通過十六進制顏色變化的5bitRGB插槽 它們只是2個字節的「插槽」。

所以我將不得不發送轉換後的colorDialog值爲5bitRGB 爲2字節的textBox,這是真的嗎?

回答

0

因此,我將不得不轉換的ColorDialog類值發送給5bitRGB爲textBox中的2個字節,這是真的可能嗎?

當然! 5位×3字段= 15位,2字節= 16位。你甚至可以留下餘地,但不多。

聽起來這只是一個處理每個領域的決議減少的問題。這可以通過逐位移位操作來將每個8位字段減少到5位字段。

您需要將存儲的值右移5位字段。您也可以將該值左移,將其用作設置Color屬性的8位(字節)字段 - 但請注意,這僅僅是5位值的8位表示形式,並且由於轉換爲5而導致分辨率損失位將繼續存在。您將不得不決定一個約定來處理解決方案的損失 - 無所事事是一種選擇。

例如:

// 8-bit color values 
byte rValue = 255; 
byte gValue = 127; 
byte bValue = 63; 

// set color 
pictureBox1.BackColor = Color.FromArgb(rValue, gValue, bValue); 

// 5-bit color values 
var rBits = new BitArray(5, false); 
var gBits = new BitArray(5, false); 
var bBits = new BitArray(5, false); 

// bit position comparison operator 
byte op = 0x80; 

// convert to 5-bit arrays 
for (int i = 0; i < 5; i++) 
{ 
    if (rValue > op) { rBits[i] = true; rValue -= op; } 
    if (gValue > op) { gBits[i] = true; gValue -= op; } 
    if (bValue > op) { bBits[i] = true; bValue -= op; } 
    op >>= 1; 
} 

byte rRetrieved = 0; 
byte gRetrieved = 0; 
byte bRetrieved = 0; 

// bit position comparison operator 
op = 0x80; 

// convert back to 8-bit bytes 
for (int i = 0; i < 5; i++) 
{ 
    if (rBits[i]) { rRetrieved += op; } 
    if (gBits[i]) { gRetrieved += op; } 
    if (bBits[i]) { bRetrieved += op; } 
    op >>= 1; 
} 

// set color - note loss of resolution due to shifting 
pictureBox1.BackColor = Color.FromArgb(rRetrieved, gRetrieved, bRetrieved); 
相關問題