Code to convert RGB to ACI (index color) without adesk color objects

Code to convert RGB to ACI (index color) without adesk color objects

JamesMaeding
Advisor Advisor
7,532 Views
1 Reply
Message 1 of 2

Code to convert RGB to ACI (index color) without adesk color objects

JamesMaeding
Advisor
Advisor

Some people need this when preparing data like dxf, but are not running inside an acad environment.

This will get the index color from rgb. Stackoverflow had the idea so I should share the result.

posted on theswamp too at:

https://www.theswamp.org/index.php?topic=52761.msg576434#msg576434

 

I tested against all 16 million colors using acad api.
My functions do not have that test in them of course, these are the final result and are fast.
They could be improved a lot if someone needed really fast lookup, this is brute force looping.
The idea came from stackoverflow but I assembled the code here and did the lookup table function.

Note that my acad background is black, as apparently the acad function for this changes depending on it.
I actually want it to be consistent, so I might say this one is better than adesk's.

 

public short GetACIfromRGB(short r, short g, short b) {
            Dictionary<short, List<short>> lookup = ACItoRGBLookup();
            //now get color using shortest dist calc and see if it matches
            double minDist = double.MaxValue;
            short match = 0; // this will end up with our answer
            for (short i = 1; i <= 255; ++i) {
                List<short> lookupcolor = lookup[i];
                double dist =
                    Math.Pow(r - lookupcolor[0], 2) +
                    Math.Pow(g - lookupcolor[1], 2) +
                    Math.Pow(b - lookupcolor[2], 2);
                if (dist < minDist) {
                    minDist = dist;
                    match = i;
                }
            }
            return match;
        }

 

 

public Dictionary<short, List<short>> ACItoRGBLookup() {
            Dictionary<short, List<short>> ret = new Dictionary<short, List<short>>();
            ret.Add(1, new List<short>() { 255, 0, 0 });
            ret.Add(2, new List<short>() { 255, 255, 0 });
            ret.Add(3, new List<short>() { 0, 255, 0 });
            ret.Add(4, new List<short>() { 0, 255, 255 });
            ret.Add(5, new List<short>() { 0, 0, 255 });
            ret.Add(6, new List<short>() { 255, 0, 255 });
            ret.Add(7, new List<short>() { 255, 255, 255 });
            ret.Add(8, new List<short>() { 128, 128, 128 });
            ret.Add(9, new List<short>() { 192, 192, 192 });
            ret.Add(10, new List<short>() { 255, 0, 0 });
            ret.Add(11, new List<short>() { 255, 127, 127 });
            ret.Add(12, new List<short>() { 204, 0, 0 });
            ret.Add(13, new List<short>() { 204, 102, 102 });
            ret.Add(14, new List<short>() { 153, 0, 0 });
            ret.Add(15, new List<short>() { 153, 76, 76 });
            ret.Add(16, new List<short>() { 127, 0, 0 });
            ret.Add(17, new List<short>() { 127, 63, 63 });
            ret.Add(18, new List<short>() { 76, 0, 0 });
            ret.Add(19, new List<short>() { 76, 38, 38 });
            ret.Add(20, new List<short>() { 255, 63, 0 });
            ret.Add(21, new List<short>() { 255, 159, 127 });
            ret.Add(22, new List<short>() { 204, 51, 0 });
            ret.Add(23, new List<short>() { 204, 127, 102 });
            ret.Add(24, new List<short>() { 153, 38, 0 });
            ret.Add(25, new List<short>() { 153, 95, 76 });
            ret.Add(26, new List<short>() { 127, 31, 0 });
            ret.Add(27, new List<short>() { 127, 79, 63 });
            ret.Add(28, new List<short>() { 76, 19, 0 });
            ret.Add(29, new List<short>() { 76, 47, 38 });
            ret.Add(30, new List<short>() { 255, 127, 0 });
            ret.Add(31, new List<short>() { 255, 191, 127 });
            ret.Add(32, new List<short>() { 204, 102, 0 });
            ret.Add(33, new List<short>() { 204, 153, 102 });
            ret.Add(34, new List<short>() { 153, 76, 0 });
            ret.Add(35, new List<short>() { 153, 114, 76 });
            ret.Add(36, new List<short>() { 127, 63, 0 });
            ret.Add(37, new List<short>() { 127, 95, 63 });
            ret.Add(38, new List<short>() { 76, 38, 0 });
            ret.Add(39, new List<short>() { 76, 57, 38 });
            ret.Add(40, new List<short>() { 255, 191, 0 });
            ret.Add(41, new List<short>() { 255, 223, 127 });
            ret.Add(42, new List<short>() { 204, 153, 0 });
            ret.Add(43, new List<short>() { 204, 178, 102 });
            ret.Add(44, new List<short>() { 153, 114, 0 });
            ret.Add(45, new List<short>() { 153, 133, 76 });
            ret.Add(46, new List<short>() { 127, 95, 0 });
            ret.Add(47, new List<short>() { 127, 111, 63 });
            ret.Add(48, new List<short>() { 76, 57, 0 });
            ret.Add(49, new List<short>() { 76, 66, 38 });
            ret.Add(50, new List<short>() { 255, 255, 0 });
            ret.Add(51, new List<short>() { 255, 255, 127 });
            ret.Add(52, new List<short>() { 204, 204, 0 });
            ret.Add(53, new List<short>() { 204, 204, 102 });
            ret.Add(54, new List<short>() { 153, 153, 0 });
            ret.Add(55, new List<short>() { 153, 153, 76 });
            ret.Add(56, new List<short>() { 127, 127, 0 });
            ret.Add(57, new List<short>() { 127, 127, 63 });
            ret.Add(58, new List<short>() { 76, 76, 0 });
            ret.Add(59, new List<short>() { 76, 76, 38 });
            ret.Add(60, new List<short>() { 191, 255, 0 });
            ret.Add(61, new List<short>() { 223, 255, 127 });
            ret.Add(62, new List<short>() { 153, 204, 0 });
            ret.Add(63, new List<short>() { 178, 204, 102 });
            ret.Add(64, new List<short>() { 114, 153, 0 });
            ret.Add(65, new List<short>() { 133, 153, 76 });
            ret.Add(66, new List<short>() { 95, 127, 0 });
            ret.Add(67, new List<short>() { 111, 127, 63 });
            ret.Add(68, new List<short>() { 57, 76, 0 });
            ret.Add(69, new List<short>() { 66, 76, 38 });
            ret.Add(70, new List<short>() { 127, 255, 0 });
            ret.Add(71, new List<short>() { 191, 255, 127 });
            ret.Add(72, new List<short>() { 102, 204, 0 });
            ret.Add(73, new List<short>() { 153, 204, 102 });
            ret.Add(74, new List<short>() { 76, 153, 0 });
            ret.Add(75, new List<short>() { 114, 153, 76 });
            ret.Add(76, new List<short>() { 63, 127, 0 });
            ret.Add(77, new List<short>() { 95, 127, 63 });
            ret.Add(78, new List<short>() { 38, 76, 0 });
            ret.Add(79, new List<short>() { 57, 76, 38 });
            ret.Add(80, new List<short>() { 63, 255, 0 });
            ret.Add(81, new List<short>() { 159, 255, 127 });
            ret.Add(82, new List<short>() { 51, 204, 0 });
            ret.Add(83, new List<short>() { 127, 204, 102 });
            ret.Add(84, new List<short>() { 38, 153, 0 });
            ret.Add(85, new List<short>() { 95, 153, 76 });
            ret.Add(86, new List<short>() { 31, 127, 0 });
            ret.Add(87, new List<short>() { 79, 127, 63 });
            ret.Add(88, new List<short>() { 19, 76, 0 });
            ret.Add(89, new List<short>() { 47, 76, 38 });
            ret.Add(90, new List<short>() { 0, 255, 0 });
            ret.Add(91, new List<short>() { 127, 255, 127 });
            ret.Add(92, new List<short>() { 0, 204, 0 });
            ret.Add(93, new List<short>() { 102, 204, 102 });
            ret.Add(94, new List<short>() { 0, 153, 0 });
            ret.Add(95, new List<short>() { 76, 153, 76 });
            ret.Add(96, new List<short>() { 0, 127, 0 });
            ret.Add(97, new List<short>() { 63, 127, 63 });
            ret.Add(98, new List<short>() { 0, 76, 0 });
            ret.Add(99, new List<short>() { 38, 76, 38 });
            ret.Add(100, new List<short>() { 0, 255, 63 });
            ret.Add(101, new List<short>() { 127, 255, 159 });
            ret.Add(102, new List<short>() { 0, 204, 51 });
            ret.Add(103, new List<short>() { 102, 204, 127 });
            ret.Add(104, new List<short>() { 0, 153, 38 });
            ret.Add(105, new List<short>() { 76, 153, 95 });
            ret.Add(106, new List<short>() { 0, 127, 31 });
            ret.Add(107, new List<short>() { 63, 127, 79 });
            ret.Add(108, new List<short>() { 0, 76, 19 });
            ret.Add(109, new List<short>() { 38, 76, 47 });
            ret.Add(110, new List<short>() { 0, 255, 127 });
            ret.Add(111, new List<short>() { 127, 255, 191 });
            ret.Add(112, new List<short>() { 0, 204, 102 });
            ret.Add(113, new List<short>() { 102, 204, 153 });
            ret.Add(114, new List<short>() { 0, 153, 76 });
            ret.Add(115, new List<short>() { 76, 153, 114 });
            ret.Add(116, new List<short>() { 0, 127, 63 });
            ret.Add(117, new List<short>() { 63, 127, 95 });
            ret.Add(118, new List<short>() { 0, 76, 38 });
            ret.Add(119, new List<short>() { 38, 76, 57 });
            ret.Add(120, new List<short>() { 0, 255, 191 });
            ret.Add(121, new List<short>() { 127, 255, 223 });
            ret.Add(122, new List<short>() { 0, 204, 153 });
            ret.Add(123, new List<short>() { 102, 204, 178 });
            ret.Add(124, new List<short>() { 0, 153, 114 });
            ret.Add(125, new List<short>() { 76, 153, 133 });
            ret.Add(126, new List<short>() { 0, 127, 95 });
            ret.Add(127, new List<short>() { 63, 127, 111 });
            ret.Add(128, new List<short>() { 0, 76, 57 });
            ret.Add(129, new List<short>() { 38, 76, 66 });
            ret.Add(130, new List<short>() { 0, 255, 255 });
            ret.Add(131, new List<short>() { 127, 255, 255 });
            ret.Add(132, new List<short>() { 0, 204, 204 });
            ret.Add(133, new List<short>() { 102, 204, 204 });
            ret.Add(134, new List<short>() { 0, 153, 153 });
            ret.Add(135, new List<short>() { 76, 153, 153 });
            ret.Add(136, new List<short>() { 0, 127, 127 });
            ret.Add(137, new List<short>() { 63, 127, 127 });
            ret.Add(138, new List<short>() { 0, 76, 76 });
            ret.Add(139, new List<short>() { 38, 76, 76 });
            ret.Add(140, new List<short>() { 0, 191, 255 });
            ret.Add(141, new List<short>() { 127, 223, 255 });
            ret.Add(142, new List<short>() { 0, 153, 204 });
            ret.Add(143, new List<short>() { 102, 178, 204 });
            ret.Add(144, new List<short>() { 0, 114, 153 });
            ret.Add(145, new List<short>() { 76, 133, 153 });
            ret.Add(146, new List<short>() { 0, 95, 127 });
            ret.Add(147, new List<short>() { 63, 111, 127 });
            ret.Add(148, new List<short>() { 0, 57, 76 });
            ret.Add(149, new List<short>() { 38, 66, 76 });
            ret.Add(150, new List<short>() { 0, 127, 255 });
            ret.Add(151, new List<short>() { 127, 191, 255 });
            ret.Add(152, new List<short>() { 0, 102, 204 });
            ret.Add(153, new List<short>() { 102, 153, 204 });
            ret.Add(154, new List<short>() { 0, 76, 153 });
            ret.Add(155, new List<short>() { 76, 114, 153 });
            ret.Add(156, new List<short>() { 0, 63, 127 });
            ret.Add(157, new List<short>() { 63, 95, 127 });
            ret.Add(158, new List<short>() { 0, 38, 76 });
            ret.Add(159, new List<short>() { 38, 57, 76 });
            ret.Add(160, new List<short>() { 0, 63, 255 });
            ret.Add(161, new List<short>() { 127, 159, 255 });
            ret.Add(162, new List<short>() { 0, 51, 204 });
            ret.Add(163, new List<short>() { 102, 127, 204 });
            ret.Add(164, new List<short>() { 0, 38, 153 });
            ret.Add(165, new List<short>() { 76, 95, 153 });
            ret.Add(166, new List<short>() { 0, 31, 127 });
            ret.Add(167, new List<short>() { 63, 79, 127 });
            ret.Add(168, new List<short>() { 0, 19, 76 });
            ret.Add(169, new List<short>() { 38, 47, 76 });
            ret.Add(170, new List<short>() { 0, 0, 255 });
            ret.Add(171, new List<short>() { 127, 127, 255 });
            ret.Add(172, new List<short>() { 0, 0, 204 });
            ret.Add(173, new List<short>() { 102, 102, 204 });
            ret.Add(174, new List<short>() { 0, 0, 153 });
            ret.Add(175, new List<short>() { 76, 76, 153 });
            ret.Add(176, new List<short>() { 0, 0, 127 });
            ret.Add(177, new List<short>() { 63, 63, 127 });
            ret.Add(178, new List<short>() { 0, 0, 76 });
            ret.Add(179, new List<short>() { 38, 38, 76 });
            ret.Add(180, new List<short>() { 63, 0, 255 });
            ret.Add(181, new List<short>() { 159, 127, 255 });
            ret.Add(182, new List<short>() { 51, 0, 204 });
            ret.Add(183, new List<short>() { 127, 102, 204 });
            ret.Add(184, new List<short>() { 38, 0, 153 });
            ret.Add(185, new List<short>() { 95, 76, 153 });
            ret.Add(186, new List<short>() { 31, 0, 127 });
            ret.Add(187, new List<short>() { 79, 63, 127 });
            ret.Add(188, new List<short>() { 19, 0, 76 });
            ret.Add(189, new List<short>() { 47, 38, 76 });
            ret.Add(190, new List<short>() { 127, 0, 255 });
            ret.Add(191, new List<short>() { 191, 127, 255 });
            ret.Add(192, new List<short>() { 102, 0, 204 });
            ret.Add(193, new List<short>() { 153, 102, 204 });
            ret.Add(194, new List<short>() { 76, 0, 153 });
            ret.Add(195, new List<short>() { 114, 76, 153 });
            ret.Add(196, new List<short>() { 63, 0, 127 });
            ret.Add(197, new List<short>() { 95, 63, 127 });
            ret.Add(198, new List<short>() { 38, 0, 76 });
            ret.Add(199, new List<short>() { 57, 38, 76 });
            ret.Add(200, new List<short>() { 191, 0, 255 });
            ret.Add(201, new List<short>() { 223, 127, 255 });
            ret.Add(202, new List<short>() { 153, 0, 204 });
            ret.Add(203, new List<short>() { 178, 102, 204 });
            ret.Add(204, new List<short>() { 114, 0, 153 });
            ret.Add(205, new List<short>() { 133, 76, 153 });
            ret.Add(206, new List<short>() { 95, 0, 127 });
            ret.Add(207, new List<short>() { 111, 63, 127 });
            ret.Add(208, new List<short>() { 57, 0, 76 });
            ret.Add(209, new List<short>() { 66, 38, 76 });
            ret.Add(210, new List<short>() { 255, 0, 255 });
            ret.Add(211, new List<short>() { 255, 127, 255 });
            ret.Add(212, new List<short>() { 204, 0, 204 });
            ret.Add(213, new List<short>() { 204, 102, 204 });
            ret.Add(214, new List<short>() { 153, 0, 153 });
            ret.Add(215, new List<short>() { 153, 76, 153 });
            ret.Add(216, new List<short>() { 127, 0, 127 });
            ret.Add(217, new List<short>() { 127, 63, 127 });
            ret.Add(218, new List<short>() { 76, 0, 76 });
            ret.Add(219, new List<short>() { 76, 38, 76 });
            ret.Add(220, new List<short>() { 255, 0, 191 });
            ret.Add(221, new List<short>() { 255, 127, 223 });
            ret.Add(222, new List<short>() { 204, 0, 153 });
            ret.Add(223, new List<short>() { 204, 102, 178 });
            ret.Add(224, new List<short>() { 153, 0, 114 });
            ret.Add(225, new List<short>() { 153, 76, 133 });
            ret.Add(226, new List<short>() { 127, 0, 95 });
            ret.Add(227, new List<short>() { 127, 63, 111 });
            ret.Add(228, new List<short>() { 76, 0, 57 });
            ret.Add(229, new List<short>() { 76, 38, 66 });
            ret.Add(230, new List<short>() { 255, 0, 127 });
            ret.Add(231, new List<short>() { 255, 127, 191 });
            ret.Add(232, new List<short>() { 204, 0, 102 });
            ret.Add(233, new List<short>() { 204, 102, 153 });
            ret.Add(234, new List<short>() { 153, 0, 76 });
            ret.Add(235, new List<short>() { 153, 76, 114 });
            ret.Add(236, new List<short>() { 127, 0, 63 });
            ret.Add(237, new List<short>() { 127, 63, 95 });
            ret.Add(238, new List<short>() { 76, 0, 38 });
            ret.Add(239, new List<short>() { 76, 38, 57 });
            ret.Add(240, new List<short>() { 255, 0, 63 });
            ret.Add(241, new List<short>() { 255, 127, 159 });
            ret.Add(242, new List<short>() { 204, 0, 51 });
            ret.Add(243, new List<short>() { 204, 102, 127 });
            ret.Add(244, new List<short>() { 153, 0, 38 });
            ret.Add(245, new List<short>() { 153, 76, 95 });
            ret.Add(246, new List<short>() { 127, 0, 31 });
            ret.Add(247, new List<short>() { 127, 63, 79 });
            ret.Add(248, new List<short>() { 76, 0, 19 });
            ret.Add(249, new List<short>() { 76, 38, 47 });
            ret.Add(250, new List<short>() { 51, 51, 51 });
            ret.Add(251, new List<short>() { 91, 91, 91 });
            ret.Add(252, new List<short>() { 132, 132, 132 });
            ret.Add(253, new List<short>() { 173, 173, 173 });
            ret.Add(254, new List<short>() { 214, 214, 214 });
            ret.Add(255, new List<short>() { 255, 255, 255 });
            return ret;
        }

internal protected virtual unsafe Human() : mostlyHarmless
I'm just here for the Shelties

7,533 Views
1 Reply
Reply (1)
Message 2 of 2

fieldguy
Advisor
Advisor

Maybe you could create your "Dictionary<short, List<short>> lookup = ACItoRGBLookup();" outside of the method? I assume you only need that once.

0 Likes