簡體   English   中英

如何使用Java將十六進制轉換為十進制rgb565?

[英]How to convert hex to decimal rgb565 using java?

我正在嘗試制作將十六進制分別轉換為十進制rgb888和rgb565的程序。

我已經做過將十六進制轉換為rgb888格式的程序,我的代碼如下所示:

String color = "0xFFFF00";
    int hexToRgb = 0;

    color.toLowerCase();
    String[] colorSplited = color.split("0x");
    String splitedConverted = colorSplited[1];

    int R = Integer.valueOf(splitedConverted.substring(0,2), 16);
    int G = Integer.valueOf(splitedConverted.substring(2,4), 16);
    int B = Integer.valueOf(splitedConverted.substring(4,6), 16);

    System.out.println(R + " " + G + " " + B);

我看到一些文章,他們解釋說每個rgb888組件R,G和B的差異為0和2 ^ 8。 我當前的程序未使用該特定過程,但得到了所需的結果。

現在,我需要制作相同的程序,但要將十六進制轉換為rgb565。 我的十六進制輸入如下所示:

String color = “0xFFE0”;

因此將被轉換為FFE0。

對於此輸入,我需要得到結果R = 31,G = 63和B =0。但是我不知道如何實現此結果。 我在互聯網上得到的是每個分量RGB的變化量分別為0 <= R <= 2 ^ 5、0 <= G <= 2 ^ 6和0 <= B <= 2 ^ 5。

不幸的是我不是數學專家。 有人可以幫助我了解其背后的數學原理,還是對我如何獲得此結果感到懷疑?

RGB顏色的典型十六進制表示形式與RGB888相同,我將嘗試通過示例進行演示。 猜猜我們有顏色

0xFF8800 ,實際上是

1111.1111.1000.1000.0000.0000作為二進制數字,其組成部分是:

R = FF = 1111.1111 = 255(點僅用於幫助查看)

G = 88 = 1000.1000 = 136

B = 00 = 0000.0000 = 0

因此,轉換是立即進行的(嗯,實際上沒有任何轉換),並且每個組件的值都可以從00到FF(十進制為0到255)

RGB565的情況不同。 您只有5位(如果是綠色,則只有6位)代表顏色的該分量。

您可以將每個組件視為參與全局顏色的百分比。

0xFF8800的示例中:

紅色組件的參與率為100%(其最大可能值為255)

綠色參與率達53.33%(值255超過136)

藍色的參與率為0%,這一點是顯而易見的。

如果將此顏色百分比應用於RGB565顏色,則將獲得每個組件的值。

因此,要將0xFF8800轉換為RGB565,請計算每個百分比

R = 1 * 31 = 31 //(percentage over 100 by the maximum value of red in RGB565 = 2^5, minus 1)

G = 0.5333 * 63 = 33.6 //(you should round this value to integer)

B = 0 * 31 = 0

這樣,最終的數字是:

  31    34    0

11111.100010.00000

      or

1111.1100.0100.0000

     in hex

0xFC40

不確定解釋是否是最好的,但希望對您有所幫助。

首先,每個十六進制字符由4位編碼。 因此,具有4個十六進制字符意味着您有16位用於編碼顏色。

RGB565將5位用於紅色,將6位用於綠色,將5位用於藍色。 顏色具有n位意味着它將具有2 ^ n個可能的值。 2 ^ 5 = 32和2 ^ 6 = 64,這是您從Internet獲得的每種顏色的不同值的來源。

要將RGB565值分成每種單獨的顏色,您需要為它們中的每一個提取對應的位,例如,如下所示:

int redMask   = 0b1111100000000000;
int greenMask = 0b0000011111100000;
int blueMask  = 0b0000000000011111;

String color = "0xFFE0";
int colorAsInteger = Integer.parseInt(color.substring(2,color.length()), 16); // convert the Hex value to int

int R = (colorAsInteger & redMask) >> 11; // keep only red bits
int G = (colorAsInteger & greenMask) >> 5; // keep only green bits
int B = colorAsInteger & blueMask; // keep only blue bits

System.out.println(R + " " + G + " " + B);

您不能像對rgb888格式那樣簡單地拆分字符串。 您應該做的是將完整的字符串轉換為數字,然后使用像這樣的移位將數字拆分:

    String color = "0xFFE0";
    int rgb = Integer.valueOf(color.substring(2,6), 16);
    int r = (rgb & 0b1111100000000000) >> 11;
    int g = (rgb & 0b0000011111100000) >> 5;
    int b = (rgb & 0b0000000000011111) >> 0;

暫無
暫無

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

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