hexdec

(PHP 4, PHP 5, PHP 7, PHP 8)

hexdec十六进制转换为十进制

描述

hexdec(string $hex_string): int|float

返回由 hex_string 参数表示的十六进制数的十进制等价物。 hexdec() 将十六进制字符串转换为十进制数。

hexdec() 会忽略遇到的任何非十六进制字符。 从 PHP 7.4.0 开始,提供任何无效字符将被弃用。

参数

hex_string

要转换的十六进制字符串

返回值

hex_string 的十进制表示

变更日志

版本 描述
7.4.0 传递无效字符现在会生成一个弃用通知。 结果仍将按不存在无效字符的方式计算。

范例

范例 #1 hexdec() 例子

<?php
var_dump
(hexdec("See"));
var_dump(hexdec("ee"));
// 两个都打印 "int(238)"

var_dump(hexdec("that")); // 打印 "int(10)"
var_dump(hexdec("a0")); // 打印 "int(160)"
?>

注释

注意:

该函数可以转换超出平台 int 类型大小的数字,较大的值在这种情况下将作为 float 返回。

参见

添加注释

用户贡献的注释 31 个注释

hafees at msn dot com
13 年前
使用此函数将十六进制颜色代码转换为其 RGB 等效值。 与此处提供的许多其他函数不同,它将正确处理十六进制颜色简写符号。

此外,如果给出了正确的十六进制颜色值(6 位),它使用按位运算来获得更快的结果。

例如:#FFF 和 #FFFFFF 将产生相同的结果

<?php
/**
* 将十六进制颜色代码转换为其 RGB 等效值
*
* @param string $hexStr (十六进制颜色值)
* @param boolean $returnAsString (如果设置为 true,则返回以分隔符分隔的值。 否则返回关联数组)
* @param string $seperator (用于分隔 RGB 值。 仅当第二个参数为 true 时适用。)
* @return array 或 string (取决于第二个参数。 如果十六进制颜色值无效,则返回 False)
*/
function hex2RGB($hexStr, $returnAsString = false, $seperator = ',') {
$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // 获取正确的十六进制字符串
$rgbArray = array();
if (
strlen($hexStr) == 6) { // 如果是正确的十六进制代码,使用按位运算进行转换。 几乎没有开销... 更快
$colorVal = hexdec($hexStr);
$rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
$rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
$rgbArray['blue'] = 0xFF & $colorVal;
} elseif (
strlen($hexStr) == 3) { // 如果是简写符号,需要一些字符串操作
$rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
$rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
$rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
} else {
return
false; // 无效的十六进制颜色代码
}
return
$returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // 返回 rgb 字符串或关联数组
} ?>

输出

hex2RGB("#FF0") -> array( red =>255, green => 255, blue => 0)
hex2RGB("#FFFF00) -> 与上面相同
hex2RGB("#FF0", true) -> 255,255,0
hex2RGB("#FF0", true, ":") -> 255:255:0
Ultimater at gmail dot com
15 年前
hexdec 不接受句点后的数字。
如果你有一个像 c20.db18 这样的数字怎么办?
<?php
function floatinghexdec($str)
{
list(
$intgr,$hex)=explode('.',$str,2);
$intgr=ereg_replace("[^A-Fa-f0-9]", "", $intgr);
$hex=ereg_replace("[^A-Fa-f0-9]", "", $hex);
$answer=0;
for(
$i=0;$i < strlen($hex); $i++)
{
$digit=hexdec(substr($hex,$i,1))/16; // .f is 15/16 because in decimal .9 is 9/10
$answer += $digit/pow(16,$i);
}
return
hexdec($intgr)+$answer;
}

echo
floatinghexdec("ff.ff");//255.99609375
?>
chrism at four dot net
22 年前
从 4.1.0 版本开始,hexdec 不会显示
相同的尺寸限制,因此
在处理大数字时,与之前的 PHP 版本有所不同。

要获得相同的结果,请使用

(int) hexdec (...)
Gabriel Reguly
18 年前
在 esnhexdec 来自 "rledger at gmail dot com" 之后,esndechex

<?php
function esndechex($dec){
$a = strtoupper(dechex(substr($dec, 1, 2)));
$b = strtoupper(dechex(substr($dec, 3, 10)));
return
$a . $b;
}
?>
Anonymous
16 年前
// 函数 GET 十六进制颜色并返回 RGB
function hexrgb($hexstr, $rgb) {
$int = hexdec($hexstr);
switch($rgb) {
case "r"
return 0xFF & $int >> 0x10;
break;
case "g"
return 0xFF & ($int >> 0x8);
break;
case "b"
return 0xFF & $int;
break;
default
return array(
"r" => 0xFF & $int >> 0x10,
"g" => 0xFF & ($int >> 0x8),
"b" => 0xFF & $int
);
break;
}
}// END GET 十六进制颜色 => RGB

// 用法
echo hexrgb("1a2b3c", r); // 26
echo hexrgb("1a2b3c", g); // 43
echo hexrgb("1a2b3c", b); // 60
// 或者

var_dump(hexrgb("1a2b3c", rgb)); //array(3) { ["r"]=> int(26) ["g"]=> int(43) ["b"]=> int(60) }
cory at lavacube dot com
18 年前
一个方便的小函数,用于将十六进制颜色代码转换为 "网络安全" 颜色...

<?php

function color_mkwebsafe ( $in )
{
// 将值放入易于使用的数组中
$vals['r'] = hexdec( substr($in, 0, 2) );
$vals['g'] = hexdec( substr($in, 2, 2) );
$vals['b'] = hexdec( substr($in, 4, 2) );

// 循环遍历
foreach( $vals as $val )
{
// 转换值
$val = ( round($val/51) * 51 );
// 转换为十六进制
$out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
}

return
$out;
}

?>

示例:color_mkwebsafe('0e5c94');
生成:006699

希望这对某些人有所帮助... 编码愉快。:-)
groobo
19 年前
这只是对 marfastic 的 ligten_up 脚本的修改,它只是将 mod_color 加/减到 orig_color。
我经常使用它来调整色调,而不仅仅是亮度

<?
function mod_color($orig_color, $mod, $mod_color){
/*
$orig_color - 原始 html 颜色,十六进制
$mod_color - 修改颜色,十六进制
$mod - 修饰符 '+' 或 '-'
用法:mod_color('CCCCCC', '+', '000033')
*/
// 执行快速验证
preg_match("/([0-9]|[A-F]){6}/i",$orig_color,$orig_arr);
preg_match("/([0-9]|[A-F]){6}/i",$mod_color,$mod_arr);
if ($orig_arr[0] && $mod_arr[0]) {
for ($i=0; $i<6; $i=$i+2) {
$orig_x = substr($orig_arr[0],$i,2);
$mod_x = substr($mod_arr[0],$i,2);
if ($mod == '+') { $new_x = hexdec($orig_x) + hexdec($mod_x); }
else { $new_x = hexdec($orig_x) - hexdec($mod_x); }
if ($new_x < 0) { $new_x = 0; }
else if ($new_x > 255) { $new_x = 255; };
$new_x = dechex($new_x);
$ret .= $new_x;
}
return $ret;
} else { return false; }
}
?>
flurinj at gmx dot net
14 年前
这是我将十六进制字符串转换为带符号十进制值的版本

<?php

function hexdecs($hex)
{
// 忽略非十六进制字符
$hex = preg_replace('/[^0-9A-Fa-f]/', '', $hex);

// 转换后的十进制值:
$dec = hexdec($hex);

// 基于十六进制长度加 1 的最大十进制值:
// 十六进制数字的位数为每 2 个十六进制 8 位 -> 最大值为 2^n
// 使用 'pow(2,n)' 因为 '1 << n' 仅适用于整数,因此仅限于整数大小。
$max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));

// 补码 = 最大值 - 转换后的十六进制:
$_dec = $max - $dec;

// 如果 dec 值大于其补码,则我们有一个负值(第一位被设置)
return $dec > $_dec ? -$_dec : $dec;
}

?>
brian at sagesport dot com
19 年前
我在现有的十六进制到十进制转换例程中遇到的问题是缺乏错误捕获。我坚持认为,在编写诸如这样的通用例程时,应该尽力覆盖所有情况。我拥有广泛的背景,涵盖了各种设计/开发语言,包括网络应用程序和桌面应用程序。因此,我看到了多种编写十六进制颜色的格式。

例如,红色可以这样编写:
#ff0000
&Hff0000
#ff
&Hff

因此,我编写了一个函数,该函数不区分大小写,并考虑了不同开发人员倾向于以不同方式格式化十六进制颜色的可能性。

<?php
function convert_color($hex){
$len = strlen($hex);
$chars = array("#","&","H","h");
$hex = strip_chars($hex, $chars);
preg_match("/([0-9]|[A-F]|[a-f]){".$len."}/i",$hex,$arr);
$hex = $arr[0];
if (
$hex) {
switch(
$len) {
case
2:
$red = hexdec($hex);
$green = 0;
$blue = 0;
break;
case
4:
$red = hexdec(substr($hex,0,2));
$green=hexdec(substr($hex,2,2));
$blue = 0;
break;
case
6:
$red = hexdec(substr($hex,0,2));
$green=hexdec(substr($hex,2,2));
$blue = hexdec(substr($hex,4,2));
break;
};
$color[success] = true;
$color[r] = $red;
$color[g] = $green;
$color[b] = $blue;
return
$color;
} else {
$color[success] = false;
$color[error] = "unable to convert hex to dec";
};
}

function
strip_chars($string, $char){
$len = strlen($string);
$count = count($char);
if (
$count >= 2) {
for (
$i=0;$i<=$count;$i++) {
if (
$char[$i]) {
$found = stristr($string,$char[$i]);
if (
$found) {
$val = substr($string,$found+1,$len-1);
$string = $val;
};
};
};
} else {
$found = stristr($string,$char);
if (
$found) {
$val = substr($string,$found+1,$len-1);
};
};
echo
$val;
return
$val;
}

/*
To use simply use the following function call:
$color = convert_color("#FF");
this will return the following assoc array if successful:
*[success] = true
*[r] = 255
*[g] = 0
*[b] = 0

or copy and paste the following code:

$hex = "FFFFFF"; // Color White
$color = convert_color($hex);
var_dump($color);
*/
?>

正如您所见,函数“convert_color”接受大多数可接受格式的十六进制 # 并返回一个关联数组。[success] 如果函数成功则设置为 TRUE,否则设置为 FALSE。数组成员 [r]、[g] 和 [b] 分别保存红色、绿色和蓝色值。如果失败,[error] 将保存自定义错误消息。

“strip_chars” 是一个支持函数,用于从十六进制字符串中删除不需要的字符,并将连接后的字符串发送回调用函数。它将接受要删除的单个值或字符数组。
Halit YEL - halityesil at globya dot net
14 年前
RGB 转十六进制
十六进制转 RGB
函数

<?PHP

function rgb2hex2rgb($c){
if(!
$c) return false;
$c = trim($c);
$out = false;
if(
preg_match("/^[0-9ABCDEFabcdef\#]+$/i", $c)){
$c = str_replace('#','', $c);
$l = strlen($c) == 3 ? 1 : (strlen($c) == 6 ? 2 : false);

if(
$l){
unset(
$out);
$out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0,1*$l));
$out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 1*$l,1*$l));
$out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 2*$l,1*$l));
}else
$out = false;

}elseif (
preg_match("/^[0-9]+(,| |.)+[0-9]+(,| |.)+[0-9]+$/i", $c)){
$spr = str_replace(array(',',' ','.'), ':', $c);
$e = explode(":", $spr);
if(
count($e) != 3) return false;
$out = '#';
for(
$i = 0; $i<3; $i++)
$e[$i] = dechex(($e[$i] <= 0)?0:(($e[$i] >= 255)?255:$e[$i]));

for(
$i = 0; $i<3; $i++)
$out .= ((strlen($e[$i]) < 2)?'0':'').$e[$i];

$out = strtoupper($out);
}else
$out = false;

return
$out;
}

?>

输出

#FFFFFF =>
数组{
red=>255,
green=>255,
blue=>255,
r=>255,
g=>255,
b=>255,
0=>255,
1=>255,
2=>255
}


#FFCCEE =>
数组{
red=>255,
green=>204,
blue=>238,
r=>255,
g=>204,
b=>238,
0=>255,
1=>204,
2=>238
}
CC22FF =>
数组{
red=>204,
green=>34,
blue=>255,
r=>204,
g=>34,
b=>255,
0=>204,
1=>34,
2=>255
}

0 65 255 => #0041FF
255.150.3 => #FF9603
100,100,250 => #6464FA


[编辑 BY danbrown AT php DOT net - 包含多个由 (ajim1417 AT gmail DOT com) 于 2010 年 1 月 27 日修复的错误:替换 explode() 中的错字,并将 eregi() 调用更新为 preg_match()。]
sneskid at hotmail dot com
12 年前
如果您想创建或解析带符号的十六进制字符串

<?php
// $d 应该是一个整数
function sdechex($d) { return ($d<0) ? ('-' . dechex(-$d)) : dechex($d); }

// $h 应该是一个字符串
function shexdec($h) { return ($h[0] === '-') ? -('0x' . substr($h,1) + 0) : ('0x' . $h + 0); }

// 测试
$h = sdechex(-123); // string(3) "-7b"
$d = shexdec($h); // int(-123)
var_dump($h, $d);
?>

还要注意,('0x' . $hexstr + 0) 比 hexdec() 更快
(在 PHP v5.2.17 上测试)
programacion at mundosica dot com
12 年前
以下是将 MAC 地址转换为十进制的另一个函数

<?php
function get_mac_decimal($mac) {
$clear_mac = preg_replace('/[^0-9A-F]/i','',$mac);
$mac_decimal = array();
for (
$i = 0; $i < strlen($clear_mac); $i += 2 ):
$mac_decimal[] = hexdec(substr($clear_mac, $i, 2));
endfor;
return
implode('.',$mac_decimal);
}
?>
匿名
19 年前
我很久以前就想知道从十六进制颜色生成 RGB 颜色的最佳方法,现在我发现最简单的方法了!

<?php
$hex
= "FF00FF";
$rgb = hexdec($hex); // 16711935
?>

我希望这能节省您的时间!:)
chuckySTAR
15 年前
这是我的使用 BC Math 的更大数字的 hexdec 函数

<?php
function bchexdec($hex)
{
$len = strlen($hex);
for (
$i = 1; $i <= $len; $i++)
$dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));

return
$dec;
}

echo
bchexdec('ffffffffffffffffffffffffffffffff') . "\n" . (pow(2, 128));
?>
helpmedalph at gmail dot com
8 年前
function hex2rgb($hex) {
if ($hex[0]=='#') $hex = substr($hex,1);
if (strlen($hex)==3){
$hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
}
$int = hexdec($hex);
return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
Manithu
17 年前
这个小型函数将返回与您提供的颜色形成对比的前景色(黑色或白色)

<?php

function getContrastColor($color)
{
return (
hexdec($color) > 0xffffff/2) ? '000000' : 'ffffff';
}

?>

此函数将返回相反的(负)颜色

<?php

function negativeColor($color)
{
// 获取红色、绿色和蓝色
$r = substr($color, 0, 2);
$g = substr($color, 2, 2);
$b = substr($color, 4, 2);

// 反转它们,现在它们是十进制数
$r = 0xff-hexdec($r);
$g = 0xff-hexdec($g);
$b = 0xff-hexdec($b);

// 现在将它们转换为十六进制并返回。
return dechex($r).dechex($g).dechex($b);
}

?>
zubfatal, root at it dot dk
19 年前
这替换了我之前的类。
我在 rgb2hex 函数中添加了一些额外的输入检查。
它还为一位数字返回了错误的十六进制值。

color::rgb2hex(array(0,0,0)) 将输出 000 而不是 00000。

<?php

/**
* 转换颜色
*
* 使用方法:
* color::hex2rgb("FFFFFF")
* color::rgb2hex(array(171,37,37))
*
* @author Tim Johannessen <[email protected]>
* @version 1.0.1
*/

class color {

/**
* 将 HEX 颜色代码转换为颜色数组。
* @return array 返回颜色数组,格式为 array(red,green,blue)
*/

function hex2rgb($hexVal = "") {
$hexVal = eregi_replace("[^a-fA-F0-9]", "", $hexVal);
if (
strlen($hexVal) != 6) { return "ERR: 错误的颜色代码,应为 6 个字符 (a-f, 0-9)"; }
$arrTmp = explode(" ", chunk_split($hexVal, 2, " "));
$arrTmp = array_map("hexdec", $arrTmp);
return array(
"red" => $arrTmp[0], "green" => $arrTmp[1], "blue" => $arrTmp[2]);
}

/**
* 将 RGB 颜色转换为 HEX 颜色代码
* @return string 返回转换后的颜色,格式为 6 位颜色代码
*/
function rgb2hex($arrColors = null) {
if (!
is_array($arrColors)) { return "ERR: 无效的输入,应为颜色数组"; }
if (
count($arrColors) < 3) { return "ERR: 无效的输入,数组过小 (3)"; }

array_splice($arrColors, 3);

for (
$x = 0; $x < count($arrColors); $x++) {
if (
strlen($arrColors[$x]) < 1) {
return
"ERR: 发现一个或多个空值,应为包含 3 个值的数组";
}

elseif (
eregi("[^0-9]", $arrColors[$x])) {
return
"ERR: 发现一个或多个非数字值。";
}

else {
if ((
intval($arrColors[$x]) < 0) || (intval($arrColors[$x]) > 255)) {
return
"ERR: 一个或多个值的范围不匹配 (0-255)";
}

else {
$arrColors[$x] = strtoupper(str_pad(dechex($arrColors[$x]), 2, 0, STR_PAD_LEFT));
}
}
}

return
implode("", $arrColors);
}

}

?>
k10206 at naver dot com
16 年前
<?
function hexrgb($hexstr) {
$int = hexdec($hexstr);

return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
?>
Walter Wlodarski
16 年前
我最喜欢的、多功能的、双向的解决方案之一,是我多年前编写的

function bgr2rgb($cr) { // 双向
return (($cr & 0x0000FF) << 16 | ($cr & 0x00FF00) | ($cr & 0xFF0000) >> 16);
}

您可能希望将其用作

function hex2cr($hex) { // 删除任何前导字符,例如 #
return bgr2rgb(hexdec($hex));
}

function cr2hex($cr) { // 通常的 HTML 格式,#rrggbb
return '#'.str_pad(strtoupper(dechex(bgr2rgb($cr))), 6, '0', STR_PAD_LEFT);
}

并且,如果您像我一样容易打错函数名,可以使用同义词

function rgb2bgr($val) { return bgr2rgb($val); }
andy at haveland dot com
13 年前
这是一个将字符串在十六进制和字符之间进行转换的简短示例

<?php
print hextostr("616E647940686176656C616E642E636F6D")."\n";

print
strtohex("Knowledge is power")."\n";

function
hextostr($x) {
$s='';
foreach(
explode("\n",trim(chunk_split($x,2))) as $h) $s.=chr(hexdec($h));
return(
$s);
}

function
strtohex($x) {
$s='';
foreach(
str_split($x) as $c) $s.=sprintf("%02X",ord($c));
return(
$s);
}
?>
Rosberg - rosberglinhares at gmail dot com
14 年前
正确版本为

function bchexdec($hex) {
static $hexdec = array(
"0" => 0,
"1" => 1,
"2" => 2,
"3" => 3,
"4" => 4,
"5" => 5,
"6" => 6,
"7" => 7,
"8" => 8,
"9" => 9,
"A" => 10,
"B" => 11,
"C" => 12,
"D" => 13,
"E" => 14,
"F" => 15
);

$dec = 0;

for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) {
$factor = $hexdec[$hex[$i]];
$dec = bcadd($dec, bcmul($factor, $e));
}

return $dec;
}
jose dot rob dot jr at gmail dot com
14 年前
我创建了这些函数将最多 64 个 ID 打包到一个 MySQL 无符号 bigint 中。

ID 不能重复,必须小于等于 bit 的限制且大于 0。

这些函数使用 PHP 32 位的 int 作为无符号,因为我们实际上并没有读取数字,只是位。然后 0xFFFFFFFF 显示 -1,但位还在(在 Linux 2.6 i686 和 x86_64 上测试过)。

---

这是另一种进行十六进制到二进制转换的方法。

<?php
function hexbin($hex, $padding = false)
{
// 验证
$hex = preg_replace('/^(0x|X)?/i', '', $hex);
$hex = preg_replace('/[[:blank:]]/', '', $hex);
if(empty(
$hex))
{
$hex = '0';
}
if(!
preg_match('/^[0-9A-F]*$/i', $hex))
{
trigger_error('参数不是十六进制', E_USER_WARNING);
return
false;
}

// 转换
$bin = '';
$hex = array_reverse(str_split($hex));
foreach(
$hex as $n)
{
$n = hexdec($n);
for(
$i = 1; $i <= 8; $i <<= 1)
{
$bin .= ($i & $n)? '1' : '0';
}
if(
$padding)
{
$bin .= ' ';
}
}
return
ltrim(strrev($bin));
}

// 测试
echo "<b>调试:</b> <pre>";

// 随机选择的填充数字
var_dump(hexbin('00FF FF8F 7F3F FF1F', true));
// string(79) "0000 0000 1111 1111 1111 1111 1000 1111 0111 1111 0011 1111 1111 1111 0001 1111"

// 黄色 RGB
var_dump(hexbin('0xF8F800'));
// string(24) "111110001111100000000000"

// 绿色 RGB (填充)
var_dump(hexbin('0x008800', true));
//string(29) "0000 0000 1000 1000 0000 0000"

die("\n<br>调试");

?>

玩得开心 ;D
bishop
19 年前
像 brian at sagesport dot com 想要的防弹十六进制到 RGB 颜色转换器,代码行数少得多。作为奖励,它还使您能够以字符串或数组的形式返回。

<?php
function &hex2rgb($hex, $asString = true)
{
// 去除任何前导 #
if (0 === strpos($hex, '#')) {
$hex = substr($hex, 1);
} else if (
0 === strpos($hex, '&H')) {
$hex = substr($hex, 2);
}

// 分割成十六进制三元组
$cutpoint = ceil(strlen($hex) / 2)-1;
$rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3);

// 将每个三元组转换为十进制
$rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0);
$rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0);
$rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0);

return (
$asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb);
}
?>

处理带有前导 # 或 &H 的 2、3 和 6 个字符颜色代码。
cgarvis at gmail dot com
17 年前
这是我的 hex2rgb 版本,用于将网络颜色转换为 24 位颜色。

<?php
function hex2rgb_webcolors($hex) {
$hex = eregi_replace("[^a-fA-F0-9]", "", $hex);
switch(
strlen($hex) ) {
case
2:
$hex = substr($hex,0,2)."0000";
break;
case
3:
$hex = substr($hex,0,1).substr($hex,0,1)
.
substr($hex,1,1).substr($hex,1,1)
.
substr($hex,2,1).substr($hex,2,1);
break;
case
4:
$hex = substr($hex,0,4)."00";
break;
case
6:
break;
default:
$hex = 0;
break;
}
return
hexdec($hex);
}
?>
repley at freemail dot it
18 年前
从颜色到颜色,到......到颜色,带淡入淡出效果。适合动态条形图。

<?php
//MultiColorFade(array hex-colors, int steps)
function MultiColorFade($hex_array, $steps) {

$tot = count($hex_array);
$gradient = array();
$fixend = 2;
$passages = $tot-1;
$stepsforpassage = floor($steps/$passages);
$stepsremain = $steps - ($stepsforpassage*$passages);

for(
$pointer = 0; $pointer < $tot-1 ; $pointer++) {

$hexstart = $hex_array[$pointer];
$hexend = $hex_array[$pointer + 1];

if(
$stepsremain > 0){
if(
$stepsremain--){
$stepsforthis = $stepsforpassage + 1;
}
}else{
$stepsforthis = $stepsforpassage;
}

if(
$pointer > 0){
$fixend = 1;
}

$start['r'] = hexdec(substr($hexstart, 0, 2));
$start['g'] = hexdec(substr($hexstart, 2, 2));
$start['b'] = hexdec(substr($hexstart, 4, 2));

$end['r'] = hexdec(substr($hexend, 0, 2));
$end['g'] = hexdec(substr($hexend, 2, 2));
$end['b'] = hexdec(substr($hexend, 4, 2));

$step['r'] = ($start['r'] - $end['r']) / ($stepsforthis);
$step['g'] = ($start['g'] - $end['g']) / ($stepsforthis);
$step['b'] = ($start['b'] - $end['b']) / ($stepsforthis);

for(
$i = 0; $i <= $stepsforthis-$fixend; $i++) {

$rgb['r'] = floor($start['r'] - ($step['r'] * $i));
$rgb['g'] = floor($start['g'] - ($step['g'] * $i));
$rgb['b'] = floor($start['b'] - ($step['b'] * $i));

$hex['r'] = sprintf('%02x', ($rgb['r']));
$hex['g'] = sprintf('%02x', ($rgb['g']));
$hex['b'] = sprintf('%02x', ($rgb['b']));

$gradient[] = strtoupper(implode(NULL, $hex));
}
}

$gradient[] = $hex_array[$tot-1];

return
$gradient;
}
//end MultiColorFade()

//start test
$multi_hex_array = array();
$multi_hex_array[] = array('FF0000','FFFF00');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF','000000');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF','000000','FFFFFF');

foreach(
$multi_hex_array as $hex_array){

$totcolors = count($hex_array);
$steps = 44;

$a = MultiColorFade($hex_array, $steps);
$tot = count($a);

$table = '<table border=1 width="300">' . "\n";

for (
$i = 0; $i < $tot; $i++){
$table .= ' <tr><td bgcolor="' . $a[$i] . '">' . ($i+1) .'</td><td><pre>' . $a[$i] . '</pre></td></tr>' . "\n";
}

$table .= '</table><br /><br />';

echo
'<br />Demanded steps = ' . $steps . '<br />';
echo
'Returned steps = ' . $tot;

if(
$steps == $tot){
echo
'<br />OK.' . $steps . ' = ' . $tot . '<br />';
}else{
echo
'<br /><span style="color:#FF0000">FAILED! Demanded steps and returned steps are NOT equal!: ' . $steps . ' != ' . $tot . '</span><br />';
}

echo
$table;

}
//end test
?>

Repley。
detrate at hotmail dot com
18 年前
我创建了这个用于一个小型的 phpbb 模块。它用于从数据库获取十六进制值,并使颜色变暗 20(以十进制表示)。

示例:#336699 到 #1f5285

<?php

$row1
= "336699"; // 颜色
$c = 20; // 差值

$rgb = array(substr($row1,0,2), substr($row1,2,2), substr($row1,4,2));

for(
$i=0; $i < 3; $i++)
{
if((
hexdec($rgb[$i])-$c) >= 0)
{
$rgb[$i] = hexdec($rgb[$i])-$c;

$rgb[$i] = dechex($rgb[$i]);
if(
hexdec($rgb[0]) <= 9)
$rgb[$i] = "0".$rgb[$i];
} else {
$rgb[$i] = "00";
}
}

$row2 = $rgb[0].$rgb[1].$rgb[2];

?>
joquius at kakugo dot com
15 年前
帮助一个十六进制字符串恢复正常

<?php
$str
= preg_replace_callback ("/%([a-zA-Z0-9]{2})/", create_function ('$matches', 'return chr (hexdec ($matches[1]));'), $str);
?>
this1is4me at hotmail dot com
16 年前
回复 Amit Yadav 的帖子(十六进制到二进制转换)

function binfromdec($num)
{
$primary = "bit";
for ($i=1; $i<=16; $i++)
${$primary.$i} = 0;

if ($num & 32768) $bit16 = 1;
if ($num & 16384) $bit15 = 1;
if ($num & 8192) $bit14 = 1;
if ($num & 4096) $bit13 = 1;
if ($num & 2048) $bit12 = 1;
if ($num & 1024) $bit11 = 1;
if ($num & 512) $bit10 = 1;
if ($num & 256) $bit9 = 1;
if ($num & 128) $bit8 = 1;
if ($num & 64) $bit7 = 1;
if ($num & 32) $bit6 = 1;
if ($num & 16) $bit5 = 1;
if ($num & 8) $bit4 = 1;
if ($num & 4) $bit3 = 1;
if ($num & 2) $bit2 = 1;
if ($num & 1) $bit1 = 1;

return ($bit16. $bit15. $bit14. $bit13. $bit12. $bit11. $bit10. $bit9. $bit8. $bit7. $bit6. $bit5. $bit4. $bit3. $bit2. $bit1);
}
maddddidley at yahoo dot com
16 年前
合并两种 RGB 颜色的函数。

function combineColors($color1, $color2) {

$color1 = str_replace("#", '', $color1);
$color2 = str_replace("#", '', $color2);

$r1 = hexdec(substr($color1, 0, 2));
$g1 = hexdec(substr($color1, 2, 2));
$b1 = hexdec(substr($color1, 4, 2));

$r2 = hexdec(substr($color2, 0, 2));
$g2 = hexdec(substr($color2, 2, 2));
$b2 = hexdec(substr($color2, 4, 2));

$r3 = ceil(($r1 + $r2) / 2);
$g3 = ceil(($g1 + $g2) / 2);
$b3 = ceil(($b1 + $b2) / 2);


$color = rgbhex($r3, $g3, $b3);
return $color = str_replace("#", '', $color);

}
ayadav at infoprocorp dot com
18 年前
来自 Amit Yadav

十六进制到二进制转换

$num = hexdec("20DF");
echo binfromdec($num);

function binfromdec($num)
{
if ($num > 32766) return ("Too Large!");
if ($num & 16384) $bit15 = 1;
if ($num & 8192) $bit14 = 1;
if ($num & 4096) $bit13 = 1;
if ($num & 2048) $bit12 = 1;
if ($num & 1024) $bit11 = 1;
if ($num & 512) $bit10 = 1;
if ($num & 256) $bit9 = 1;
if ($num & 128) $bit8 = 1;
if ($num & 64) $bit7 = 1;
if ($num & 32) $bit6 = 1;
if ($num & 16) $bit5 = 1;
if ($num & 8) $bit4 = 1;
if ($num & 4) $bit3 = 1;
if ($num & 2) $bit2 = 1;
if ($num & 1) $bit1 = 1;

return ("" . $bit15 . $bit14 . $bit13 . $bit12 . $bit11 . $bit10 . $bit9 . $bit8 . $bit7 . $bit6 . $bit5 . $bit4 . $bit3 . $bit2 . $bit1);

}
andreas.schmeiler
21 年前
这里还有另一个 hex2bin 变体,对我来说运行良好。

function hex2bin($hexdata) {

for ($i=0;$i<strlen($hexdata);$i+=2) {
$bindata.=chr(hexdec(substr($hexdata,$i,2)));
}

return $bindata;
}
To Top