在UNIX shell脚本中将十六进制颜色转换为十进制RGB值

ico*_*ast 5 shell rgb hex decimal

我敢肯定有人已经解决了这个问题:什么是一种简单易用的方法,可以将十六进制颜色值(000000到FFFFFF之间的任何值)转换为0到255之间的3个十进制值.(如果你不熟悉颜色的方式)传统上用HTML表示,前两个十六进制数字是第一个十进制数字,依此类推.)

plu*_*dra 9

$ cat hexrgb.sh
#!/bin/bash
hex="11001A"
printf "%d %d %d\n" 0x${hex:0:2} 0x${hex:2:2} 0x${hex:4:2}

$ ./hexrgb.sh
17 0 26
Run Code Online (Sandbox Code Playgroud)

如果你不愿意使用bash进行子串扩展,我仍然会使用printf进行转换.


Flo*_*ita 5

您可以使用以下脚本:

#!/bin/sh
# hextorgb.sh
hexinput=`echo $1 | tr '[:lower:]' '[:upper:]'`  # uppercase-ing
a=`echo $hexinput | cut -c-2`
b=`echo $hexinput | cut -c3-4`
c=`echo $hexinput | cut -c5-6`

r=`echo "ibase=16; $a" | bc`
g=`echo "ibase=16; $b" | bc`
b=`echo "ibase=16; $c" | bc`

echo $r $g $b
exit 0
Run Code Online (Sandbox Code Playgroud)

并使用它像:

./hextorgb.sh "11001A"
Run Code Online (Sandbox Code Playgroud)

产生如下输出:

17 0 26
Run Code Online (Sandbox Code Playgroud)

它可以通过测试参数等来改进,但它可以做你想要的.


mat*_*mc3 1

如果您需要此脚本的 POSIX 兼容版本来处理更有效的 CSS 十六进制颜色格式(即:带有 alpha 通道的 4 部分#AABBCCDD,3 个字符快捷方式#FFF),这应该可以解决问题:

#!/bin/sh
##? ~/bin/hex2rgb - convert color hex to rgb
# '#C0FFEE' => 192 255 238
# 'DEADBEEF' => 222 173 190 239
# 'fab' => 255 170 187
__hex2rgb() {
  # reset $1 to scrubbed hex: '#01efa9' becomes '01EFA9'
  set -- "$(echo "$1" | tr -d '#' | tr '[:lower:]' '[:upper:]')"
  START=0
  STR=
  while (( START < ${#1} )); do
    # double each char under len 6 : FAB => FFAABB
    if (( ${#1} < 6 )); then
      STR="$(printf "${1:${START}:1}%.0s" 1 2)"
      (( START += 1 ))
    else
      STR="${1:${START}:2}"
      (( START += 2 ))
    fi
    echo "ibase=16; ${STR}" | bc
  done
  unset START STR
}
__hex2rgb "$@"
Run Code Online (Sandbox Code Playgroud)