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

mkshixfv  于 2023-03-09  发布在  Shell
关注(0)|答案(5)|浏览(327)

我相信已经有人解决了这个问题:什么是一种简单、可移植的方法,可以将十六进制颜色值(从000000到FFFFFF的任何值)转换为从0到255的3个十进制值(如果您不熟悉HTML中颜色的传统表示方式,前两位十六进制数字是第一个十进制数,依此类推)。

qcuzuvrc

qcuzuvrc1#

$ 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

如果您不愿意使用bash进行子字符串扩展,我仍然会使用printf进行转换。

nimxete2

nimxete22#

您可以使用如下脚本:

#!/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

像这样使用它:

./hextorgb.sh "11001A"

从而产生如下输出:

17 0 26

可以通过测试参数等方法来改进它,但它做的是您想要做的。

brvekthn

brvekthn3#

如果您需要此脚本的POSIX兼容版本,以处理更多有效的CSS十六进制颜色格式(即:4部分,带有alpha通道#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 "$@"
qco9c6ql

qco9c6ql4#

#!/usr/bin/env bash

hex2rgb() {
    hex=$(echo "${1^^}" | sed 's/#//g')

    a=$(echo $hex | cut -c-2)
    b=$(echo $hex | cut -c3-4)
    c=$(echo $hex | cut -c5-6)

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

    echo ${1^^}
    echo $r $g $b
}

hex2rgb "#FF0000"
hex2rgb "#00FF00"
hex2rgb "#0000FF"
s71maibg

s71maibg5#

我知道这个问题已经很老了,但我想补充一个轶事。
或者,如果你想把rgb转换成hex,你可以做一些类似的事情:

#!/bin/sh
# rgbtohex.sh
f="$1,"
focus=0
start=0
until [ "$limit" == "3" ]
  do
    focus=$((focus+1))
    if [ "${f:$focus:1}" == "," ]
    then
        limit=$((limit+1))
        length=$(($focus-$start))
        let c$limit="${f:start:length}"
        start=$((focus+1))
    fi
done
r=`echo "obase=16; $c1" | bc`
r2=`echo "obase=16; $c2" | bc`
r3=`echo "obase=16; $c3" | bc`
if [ "${r:1:2}" == "" ]
  then r=0$r
fi
if [ "${r2:1:2}" == "" ]
  then r2=0$r2
fi
if [ "${r3:1:2}" == "" ]
  then r3=0$r3
fi
echo $r$r2$r3

相关问题