How can I convert Hexadecimal to RGB Color and vice-versa?

Ali Çehreli acehreli at yahoo.com
Fri Oct 16 21:53:49 UTC 2020


On 10/16/20 1:10 PM, Marcone wrote:
> How can I convert Hexadecimal to RGB Color and vice-versa?

On 10/16/20 1:10 PM, Marcone wrote:

 > How can I convert Hexadecimal to RGB Color and vice-versa?

Do you mean from a string like "#123456" to the values of red, green, 
and blue? I am having more fun with D than usual. So, I wrote the 
following without understanding your requirements. :)

I am sure this already exists in various libraries.

import std.exception;
import std.range;
import std.format;
import std.stdio;
import std.traits;

struct RGB {
   ubyte red;
   ubyte green;
   ubyte blue;

   this(const(char)[] s) {
     enforce(s.length < 8, format!`Invalid RGB string: "%s"`(s));

     if (s.front == '#') {
       s.popFront();
     }

      uint value;
      s.formattedRead!"%x"(value);
      this(value);
   }

   this(T)(T value)
   if (isIntegral!T) {
     enforce(value >= 0 && value < 0x100_0000,
             format!"Invalid RGB value: %s (0x%,*?x)"(value, 2, '_', 
value));

     ubyte popLowByte() {
       ubyte b = value & 0xff;
       value >>= 8;
       return b;
     }

     this.blue = popLowByte();
     this.green = popLowByte();
     this.red = popLowByte();

     assert(value == 0);
   }

   string asHex() {
     return format!"%02x%02x%02x"(red, green, blue);
   }
}

void main() {
   auto a = RGB("#a0a0a0");
   writeln(a);

   auto b = RGB(0x10ff20);
   writeln(b);
   writeln(b.asHex);
}

Ali


More information about the Digitalmars-d-learn mailing list