Wie konvertiere ich HEX2 in RGBA?

11

Die Welt der Kunst ist voller Farben, aber die Welt des Netzwerks ist noch voller als die Welt der Kunst mit verschiedenen Farben und Renderings. Deshalb müssen wir wissen, wie man eine Art von Farbformat in eine andere konvertiert.

Die Herausforderung liegt auf der Hand:

Schreiben Sie ein Programm / eine Funktion, um dann einen bestimmten HEX- Code ( #00ff0080zum Beispiel) in RGBA (wie rgba(0, 255, 0, 0.5)) zu konvertieren .

Regeln:

  • Externe Bibliotheken / integrierte Funktionen zum Konvertieren von HEX in RGBA sind nicht zulässig. Solche jQuery- und Syntax-Ersetzer sind jedoch akzeptabel.
  • Es gelten die Standard-Eingabe- / Ausgaberegeln.
  • Das Format des Alphas kann zwischen (1 == 100%) oder dem anderen (100 == 100%) liegen, was nicht wirklich wichtig ist.
  • Die Ausgabe ist flexibel , solange sie die 4 konvertierten Werte zurückgibt (als String, Array, Liste Ihrer Wahl).
  • Sie können die Eingabe ohne die #am Anfang übernehmen. Daher können Sie Eingaben entweder als #RRGGBBAAoder als nehmen RRGGBBAA. Sie können davon ausgehen, dass der Hex-Code (ohne den #) immer 8 Zeichen lang ist.
  • Sie sollten alle Werte durch 255 teilen, einschließlich des Alphas. Die minimale Dezimalgenauigkeit (für das Alpha sind 2 Dezimalstellen).

Testfälle

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

Wertung

, der Code mit der geringsten Anzahl von Bytes gewinnt.

Obsdarek
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Dennis
1
Müssen wir den "Hex-Code" als Zeichenfolge verwenden ? Sie sagen, wir können es ohne den führenden nehmen #. In diesem Fall wäre es nur ein 32-Bit-Ganzzahlwert. Ist es legal, das so zu nehmen?
Cody Gray

Antworten:

4

JavaScript (ES6), 73 54 50 Byte

(Einige Bytes wurden dank @LeakyNun, der bearbeiteten Herausforderung und @CraigAyre gespeichert.)

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'));

Rick Hitchcock
quelle
Rick, es sieht so aus, als hätten wir jetzt die endgültige Spezifikation dafür, damit du deine Antwort aktualisieren kannst.
Shaggy
Zusätzlich zu @ Shaggys Kommentar können Sie ein paar Bytes speichern, indem Sie evalanstelle von parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre
@CraigAyre, evalist eine großartige Alternative zu Golfzwecken parseInt, danke!
Rick Hitchcock
@ RickHitchcock, keine Sorge! Sie können auch ein paar Bytes aus dem regulären Ausdruck mit rasieren /../g. Sie können es möglicherweise noch weiter reduzieren, indem Sie replaceüber match/map
Craig Ayre
Oh, ich sehe, dass sich die Regeln geändert haben, sodass das anfängliche Pfundzeichen nicht mehr benötigt wird.
Rick Hitchcock
3

Japt , 13 Bytes

Nimmt die Eingabe als Zeichenfolge ohne die führende #. Gibt den rgba-Wert als Array aus.

ò ®nG
pUo /#ÿ

Probier es aus


Erläuterung

Wir nehmen den String implizit als Eingabe über eine Variable U.
"00ff0080"

ò

Teilen Sie die Zeichenfolge in ein Array von Elementen der Länge 2 auf.
["00","ff","00","80"]

®nG

Ordnen Sie das Array zu und konvertieren Sie jedes Element von einer Basis-16-Zeichenfolge in eine Dezimalzahl. Aufgrund des folgenden Zeilenumbruchs wird dieses Array implizit einer Variablen zugewiesen U.
[0,255,0,128]

Uo

Pop das letzte Element aus dem Array.
128

/#ÿ

Teilen Sie es durch 255.
0.5019607843137255

p

Schieben Sie das Ergebnis zurück in Udas endgültige Array und geben Sie es implizit aus.
[0,255,0,0.5019607843137255]

Zottelig
quelle
2

C (gcc) , 139 Bytes

C(x){x=x>57?x-87:x-48;}
#define Z C(h[i])*16+C(h[++i]))
i;f(char*h){printf("rgba(");for(i=0;i<6;i++)printf("%i, ",Z;printf("%g)",(Z/256.);}

Probieren Sie es online aus!

Mein anderer Versuch wurde mit 145 Bytes getaktet . Ich bin kein großer C-Golfer, daher könnte dies wahrscheinlich kürzer sein.

Conor O'Brien
quelle
2

05AB1E , 9 Bytes

2ôH`255/)

Probieren Sie es online aus!

Zumindest haben wir Unterstützer wie Emigna , die oft einen gesunden Menschenverstand verwenden ... (das bekommt man den ganzen Tag zum Golfen und dann 2ô16öRć255/¸ìRfängt man an, Sachen wie ಠ_ಠ zu produzieren)

Erik der Outgolfer
quelle
5 Bytes kürzer:2ôH`žz/)
Emigna
@ Emigna Die Herausforderung wurde trotzdem geschlossen ...
Erik der Outgolfer
1

Gelee , 15 14 Bytes

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

Probieren Sie es online aus!

Wie es funktioniert

Ø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 Byte dank @EricTheOutgolfer

fireflame241
quelle
1

PHP, 72 Bytes

Jörgs Array-Ausgabeversion ist unschlagbar; Es gibt aber auch andere Möglichkeiten:

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

Laufen Sie als Rohr mit -F. #spielt keine Rolle, einfache CSV-Ausgabe

oder 73 Bytes (laufen mit -R):

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

74 Bytes mit den Leerzeichen:

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

nicht so einfach, 81 Bytes :

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

Excel, 99 Bytes

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

SmileBASIC, 50 Bytes

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

Die hexadezimale Zeichenfolge wird mit VAL () in eine Zahl konvertiert, und RGBREAD extrahiert jedes Byte. #L ist eine Konstante mit dem Wert 256.

RGBREAD wurde entwickelt, um die Kanäle aus einer ARGB-Farbe zu extrahieren, aber es teilt wirklich nur eine 4-Byte-Ganzzahl in 4 separate Bytes auf, sodass die Reihenfolge keine Rolle spielt.

12Me21
quelle
Ich mag es immer, grundlegende Antworten zu sehen, aber ich befürchte, dass diese Antwort ungültig sein könnte, da sie eine integrierte Funktion zum Konvertieren von Hexadezimalzahlen in rgba verwendet
Taylor Scott
Ich denke, es zählt nicht als eingebautes Hex-> RGBA, da es einen zusätzlichen Schritt erfordert, um die Hex-Zeichenfolge in eine Ganzzahl umzuwandeln.
12Me21
Wenn Sie es noch einmal betrachten, denke ich, dass Sie Recht haben, würde die explizite Konvertierung von hex zu int es gültig machen.
Taylor Scott
0

JS ES2015, 84 Byte

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

Das ist eine Funktion. Führen Sie es mit aus

( CODE )("#00ff0080")
Евгений Новиков
quelle
0

q / kdb +, 43 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

{                                         } / 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 
Streetster
quelle
0

APL (Dyalog) , 24 Bytes

Erfordert, ⎕IO←0was auf vielen Systemen Standard ist. Fordert zur Eingabe als Großbuchstaben ohne auf #.

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

Probieren Sie es online aus!

⎕D,⎕AD igits gefolgt von A lphabet

⍞⍳⍨ Eingabeaufforderung zur Texteingabe (Mnemonik: Konsole mit Anführungszeichen) und darin den Index jedes Buchstabens finden

4 2⍴r eshape als vierreihige zweispaltigen Matrix

 transponieren (weil die Basiskonvertierung spaltenweise funktioniert)

16⊥ als Basis sechzehn bewerten

 Ausbeute (dient zur Trennung von 3 und 16)

256÷⍨@3 Unterteile das 4 - ten Element durch 256

Adam
quelle
0

Yabasic , 96 Bytes

Noch eine Antwort; Übernimmt Eingaben als Zeichenfolge und Ausgaben an die Konsole.

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

Probieren Sie es online aus!

Taylor Scott
quelle
Sie können ein Byte speichern, indem Sie den Zeilenumbruch vorher entfernen ?.
12Me21
0

Excel VBA, 90 Bytes

Eine anonyme VBE-Sofortfensterfunktion, die Eingaben aus dem Bereich übernimmt [A1]und in das VBE-Sofortfenster ausgibt.

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

Vim, 46 Bytes

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

Übernimmt Eingaben ohne #und kehrt durch Drucken auf dem Bildschirm zurück.

Herman L.
quelle