转换为 3 位十六进制颜色代码

Posted

技术标签:

【中文标题】转换为 3 位十六进制颜色代码【英文标题】:convert to 3-digit hex color code 【发布时间】:2010-11-30 08:45:00 【问题描述】:

长期以来,我一直在 CSS 中使用 3 位十六进制颜色值:#fff#999#069 等。我可以看到重复的字母/数字如何合并以创建 3 -digit 十六进制颜色代码,但我不完全理解能够在 php 中编写转换器的模式。有这方面的文档吗?

编辑:哦,也许我的问题不清楚。我需要知道一些 6 位十六进制颜色值是如何转换为 3 位的。 xxxxxx (ffffff) 和 xxyyzz (006699) – 这是仅有的两种模式,对吗?

【问题讨论】:

您以哪种方式看待转换?从 3 位到 6 位?还是从十六进制到十进制? 转换器的好处肯定是非常有限的。毕竟,只能简化一小部分颜色代码,而每个代码仅节省 3 个字符。如果有任何文档,我会感到惊讶,但作为编程练习,它可能很有用。 哦,也许我的问题不清楚。我需要知道一些 6 位十六进制颜色值是如何转换为 3 位的? xxxxxx (ffffff) xxyyzz (006699),只有这两种模式,对吗? 【参考方案1】:

3位CSS代码是6位的缩写”:#06a;是#0066aa; 每两个数字代表一个从 0 到 255 的数字。 只需将这些值转换为十六进制并返回即可。

【讨论】:

【参考方案2】:

要将 3 个字符的十六进制代码转换为 6 个字符的代码,您需要重复每个字符:

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

如果要将其转换为十进制,可以使用hexdec 函数

【讨论】:

【参考方案3】:

#f0f 扩展为#ff00ff 所以基本上你只需要计算每个字符的值和值乘以 16,例如:

#f98: f = 15 => 红色 = 15 + 15*16 = 255 等等

【讨论】:

啊,我似乎没有抓住重点 - 以及我对 API 咨询的感觉 (hexdec())。 那么,使用这个逻辑,你可以通过除以 16 来反转它以获得十六进制 3 版本? @Josh 好吧,是的。但您会有效地将自己的粒度限制为每个频道 16 个而不是 256 个。【参考方案4】:

function hexfix(str) 
  var v, w;
  v = parseInt(str, 16);	// in rrggbb
  if (str.length == 3) 
    // nybble colors - fix to hex colors
	//  0x00000rgb              -> 0x000r0g0b
	//  0x000r0g0b | 0x00r0g0b0 -> 0x00rrggbb
	w = ((v & 0xF00) << 8) | ((v & 0x0F0) << 4) | (v & 0x00F);
	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)+'.  '));

类似的东西。

【讨论】:

以上是关于转换为 3 位十六进制颜色代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CSS 中使用 3 位颜色代码而不是 6 位颜色代码?

将 8 位十六进制颜色转换为 rgba 颜色?

将十六进制 HTML 颜色转换为 Amiga colorregister hex(和返回)

颜色字符串转换(正则)

HTML 教程下

十六进制颜色码的对照表