2009-09-22 145 views
8

我一直在CSS中使用3位十六進制顏色值很長時間:#fff,#999,#069等我可以看到重複的字母/數字是如何合併創建的一個3位十六進制顏色代碼,但我不完全理解這種模式能夠在PHP中編寫轉換器。有這方面的文件嗎?轉換爲3位十六進制顏色代碼

編輯:哦,也許我的問題不清楚。我需要知道一些6位十六進制顏色值是如何轉換爲3位的。 xxxxxxffffff)和xxyyzz006699) - 這些是唯一的兩種模式,對嗎?

+0

你在轉換哪種方式?從3到6位數?或從十六進制到十進制? – peirix 2009-09-22 10:30:15

+0

轉換器的好處肯定會非常有限。畢竟,只有一小部分顏色代碼可以簡化,並且每個代碼只能節省3個字符。如果有任何文檔,我會感到驚訝,但作爲編程練習,它可能是有用的。 – pavium 2009-09-22 10:32:52

+0

哦,也許我的問題不清楚。我需要知道一些6位十六進制顏色值是如何轉換爲3位的? xxxxxx(ffffff)xxyyzz(006699),這些是唯一的兩種模式,對嗎? – 3zzy 2009-09-22 17:55:00

回答

27

要轉換一個3個字符的十六進制代碼爲6個字符的一個,你需要重複每一個字符:

$hex = '#fff'; 
$hex6 = '#' . $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3]; 

如果你想將它轉換爲十進制可以使用hexdec功能

2

3位CSS代碼是短期的6位數字「:#06A;被#0066aa;
每兩個數字代表其數量從0到255
轉換這些值爲十六進制和背面是所有你需要

2

#f0f膨脹以#ff00ff所以基本上你只需要計算的值,併爲每個字符的值乘以16,例如:

#f98:F = 15 =>紅色= 15 + 15 * 16 = 255等

+0

啊,我似乎錯過了這個觀點 - 以及我對API的理解('hexdec()')。 – jensgram 2009-09-22 10:32:24

+0

因此,使用這個邏輯,你可以通過將其除以16以得到十六進制3版本來反轉它? – Josh 2015-07-23 17:05:01

+0

@Josh好的,是的。但是,你將有效地限制自己的粒度爲每個通道16個而不是256個。 – jensgram 2015-07-27 04:56:53

1

function hexfix(str) { 
 
    var v, w; 
 
    v = parseInt(str, 16); \t // in rrggbb 
 
    if (str.length == 3) { 
 
    // nybble colors - fix to hex colors 
 
\t // 0x00000rgb    -> 0x000r0g0b 
 
\t // 0x000r0g0b | 0x00r0g0b0 -> 0x00rrggbb 
 
\t w = ((v & 0xF00) << 8) | ((v & 0x0F0) << 4) | (v & 0x00F); 
 
\t v = w | (w << 4); 
 
    } 
 
    return v.toString(16).toUpperCase(); 
 
} 
 

 
var hex1 = 'AABBCC', 
 
    hex2 = 'ABC'; 
 

 
document.body.appendChild(document.createTextNode(hex1+" becomes "+hexfix(hex1)+'. ')); 
 
document.body.appendChild(document.createTextNode(hex2+" becomes "+hexfix(hex2)+'. '));

這樣的事情。

相關問題