我确定有人已经解决了这个问题:将十六进制颜色值(000000到FFFFFF之间的任何内容)转换为0到255之间的3个十进制值是一种简单易用的方法。(如果你不熟悉的话)传统上用HTML表示颜色的方式,前两个十六进制数字是第一个十进制数字,依此类推。)
答案 0 :(得分:8)
$ 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进行转换。
答案 1 :(得分: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
并使用它:
./hextorgb.sh "11001A"
产生如下输出:
17 0 26
可以通过测试参数等来改进它,但它可以做你想要的。
答案 2 :(得分:0)
#!/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"
答案 3 :(得分:0)
我知道这个问题已经很老了,但要加上一个轶事;
或者,如果您想将rgb转换为十六进制,则可以执行以下操作:
#!/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