怎么把HEX2转换成RGBA?


11

艺术世界充满了色彩,但网络世界比其他色彩及其渲染的艺术世界还要充实。因此,我们需要知道如何将一种颜色格式转换为另一种颜色格式。

挑战不言而喻:

编写程序/函数,然后将给定的十六进制代码(#00ff0080例如)转换为RGBA(如rgba(0, 255, 0, 0.5))。

规则:

  • 禁止使用外部库/内置程序将HEX转换为RGBA。但是,可接受jQuery和类似的语法替换器。
  • 标准输入/输出规则适用。
  • alpha的格式可以在(1 == 100%)或其他(100 == 100%)之间,这并不是很重要。
  • 只要返回4个转换后的值(如字符串,数组,列表,您可以选择),输出就很灵活
  • 您可以选择不输入#开头。因此,您可以将输入作为#RRGGBBAARRGGBBAA。您可以假定十六进制代码(除外#)将始终为8个字符。
  • 您应将所有值除以255,包括alpha。最小十进制精度(对于alpha来说,将为2个小数位)。

测试用例

Input:  00ff0080
Output: 0, 255, 0, 0.5

计分

,字节最少的代码获胜。


评论不作进一步讨论;此对话已转移至聊天
丹尼斯,

1
是否需要将“十六进制代码”作为字符串?您说我们可以不带前导来接受它#,在这种情况下,它只是32位整数值。那样做合法吗?
科迪·格雷

Answers:


4

JavaScript(ES6),73 54 50字节

(由于编辑了挑战@LeakyNun和@CraigAyre,节省了一些字节。)

s=>s.match(/../g).map((c,i)=>('0x'+c)/(i-3?1:255))

let f=

s=>s.match(/../g).map((c,i)=>('0x'+c)/(i-3?1:255))

console.log(f('00ff0080'));


瑞克,看来我们现在有这方面的最终规格,因此您可以更新您的答案。
毛茸茸的

除了@Shaggy的注释,您还可以使用eval而不是节省一些字节parseInts=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre

@CraigAyre,evalparseInt打高尔夫球的绝佳选择,谢谢!
里克·希区柯克

@RickHitchcock,不用担心!您也可以使用来从正则表达式中剃掉几个字节/../g。你也许可以进一步降低其使用replacematch/map
克雷格艾尔

哦,我看到规则已经更改,因此不再需要初始的井号。
里克·希区柯克

3

Japt,13个字节

将输入作为字符串,不带前导#。将rgba值输出为数组。

ò ®nG
pUo /#ÿ

测试一下


说明

我们通过变量隐式地将字符串作为输入U
"00ff0080"

ò

将字符串拆分为长度为2的元素数组。
["00","ff","00","80"]

®nG

映射到数组,并将每个元素从基数16的字符串转换为十进制数。由于以下换行符,该数组被隐式分配给variable U
[0,255,0,128]

Uo

从数组中弹出最后一个元素。
128

/#ÿ

除以255。
0.5019607843137255

p

将结果推回,U然后隐式输出最终数组。
[0,255,0,0.5019607843137255]


2

PHP,63字节

输出为数组

$h=array_map(hexdec,str_split($argn,2));$h[3]/=255;print_r($h);

在线尝试!

PHP,80字节

输出为rgba值,输入不带 #

$h=array_map(hexdec,str_split($argn,2));$h[3]/=255;echo"rgba(",join(",",$h),")";

在线尝试!

PHP,88字节

输出为rgba值,输入为 #

for(;$i<7;)$h[]=hexdec($argn[++$i].$argn[++$i]);$h[3]/=255;echo"rgba(",join(",",$h),")";

在线尝试!




1

果冻15 14字节

Øhi$€’s2ḅ⁴÷4¦⁹

在线尝试!

这个怎么运作

Øhi$€’s2ḅ⁴÷4¦⁹ - main link, takes input without # and all lowercase
   $€             - to each input character:
  i               - return its 1-based index in
Øh                - the string "0123456789abcdef"
     ’            - decrement (otherwise 0 is mapped to 1 and f to 16)
      s2          - split the characters into groups of two
        ḅ⁴        - convert from base 16 to decimal
           4¦     - on the fourth element:
          ÷       - divide by
             ⁹    - 256

-1个字节感谢@EricTheOutgolfer


1

PHP,72字节

Jörg的阵列输出版本无与伦比;但还有其他选择:

<?=($a=hexdec($argn))>>24,",",255&$a>>16,",",255&$a>>8,",",(255&$a)>256;

与一起作为管道运行-F#没关系,纯csv输出

73个字节(使用-R):

for($a=hexdec($argn);$i++<4;)echo(255&$a>>32-8*$i)/($i<4?:256),","[$i>3];

74个字节,带空格:

<?=($a=hexdec($argn))>>24,$c=", ",255&$a>>16,$c,255&$a>>8,$c,(255&$a)>256;

不那么简单,81个字节

rgba(<?=($a=hexdec($argn))>>24,$c=", ",255&$a>>16,$c,255&$a>>8,$c,(255&$a)/256?>)


1

Excel,99个字节

=HEX2DEC(LEFT(A1,2))&","&HEX2DEC(MID(A1,3,2))&","&HEX2DEC(MID(A1,5,2))&","&HEX2DEC(RIGHT(A1,2))/256

1

SmileBASIC,50个字节

INPUT H$RGBREAD VAL("&H"+H$)OUT R,G,B,A?R,G,B,A/#L

使用VAL()将十六进制字符串转换为数字,然后RGBREAD提取每个字节。#L是值为256的常数。

RGBREAD旨在从ARGB颜色中提取通道,但实际上它只是将4字节整数拆分为4个单独的字节,因此顺序无关紧要。


我总是喜欢看到基本的响应,但是我担心此响应可能无效,因为它使用了将十六进制转换为rgba的内置方法
Taylor Scott

我认为它不算在内建的hex-> rgba中,因为它需要一个额外的步骤才能将hex字符串转换为整数。
18Me21年

实际上,再次查看它,我认为您是对的,从十六进制到整数的显式转换将使其有效。
泰勒·斯科特


0

JS ES2015,84个字节

$=>{a=[1,3,5,7].map(b=>eval("0x"+$.substr(b,2)));a[3]=(a[3]/256);return a.join(",")}

这是一个功能。使用运行它

( CODE )("#00ff0080")


0

q / kdb +,43个字节

解:

{(16 sv'(.Q.n,6#.Q.a)?/:2 cut x)%1 1 1 256}

例:

q){(16 sv'(.Q.n,6#.Q.a)?/:2 cut x)%1 1 1 256}"00ff0080"
0 255 0 0.5

说明:

{                                         } / anonymous lambda function
                        2 cut x             / split input into 2-char length lists
                     ?/:                    / returns index where (each-right) item is found in 'the list'
        (           )                       / 'the list'
              6#.Q.a                        / Q.a is lowercase alphabet, 6# takes first 6 chars
         .Q.n,                              / Q.n is "012..89", so prepend this onto the "abcdef"                         
  16 sv'                                    / converts each index from base 16 to base 10
 (                            )%1 1 1 256   / divide this output by 1,1,1,256 to get alpha in 0..1 range 

0

APL(Dyalog),24字节

要求⎕IO←0在许多系统上是默认设置。提示输入不带的大写字母#

256÷⍨@316⊥⍉4 2⍴⍞⍳⍨⎕D,⎕A

在线尝试!

⎕D,⎕A数字后跟A字母

⍞⍳⍨ 提示输入文本(助记符:带引号的控制台),并在其中找到每个字母的ɩndex

4 2⍴ř ESHAPE四个行两列的矩阵

 转置(因为基本转换按列进行)

16⊥ 以16 为基数进行评估

 产量(分别为3和16)

256÷⍨@3 将第4 元素除以256



0

Yabasic,96字节

另一个答案;将输入作为字符串并输出到控制台。

Input""a$
For i=1To 7Step 2
?Dec(Mid$(a$,i,2))/(j+1);
If i=5Then j=255Fi
If i<7Then?", ";Fi
Next

在线尝试!


您可以通过删除之前的换行符来节省一个字节?
18Me21年

0

Excel VBA,90个字节

匿名VBE立即窗口函数,该函数从范围中获取输入[A1]并输出到VBE立即窗口。

For i=1To 7Step 2:[B1]=i:?[Hex2Dec(Mid(A1,B1,2))]/IIf(i=7,256,1)&""+IIf(i<7,", ","");:Next

0

Vim,46个字节

:s/../$((16#&)) /g␊iecho ␛$hhi*100/255␛:w !sh␊

接受不带的输入,#并通过在屏幕上打印返回。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.