This language bar is your friend. Select your favorite languages!
Select your favorite languages :
- Or search :
Idiom #154 Halfway between two hex color codes
Find color c, the average between colors c1, c2.
c, c1, c2 are strings of hex color codes: 7 chars, beginning with a number sign # .
Assume linear computations, ignore gamma corrections.

Color color1 = ColorTranslator.FromHtml(c1);
Color color2 = ColorTranslator.FromHtml(c2);
c = string.Format($"#{((color1.R + color2.R) / 2):X2}{((color1.G + color2.G) / 2):X2}{((color1.B + color2.B) / 2):X2}");
string c = roundRobin(c1.dropOne.chunks(2), c2.dropOne.chunks(2))
.map!(a => a.to!int(16)).array
.chunks(2)
.map!(a => ((a[0] + a[1]) / 2))
.fold!((a,b) => a ~= "%.2X".format(b))("#");
var buf [7]byte
buf[0] = '#'
for i := 0; i < 3; i++ {
sub1 := c1[1+2*i : 3+2*i]
sub2 := c2[1+2*i : 3+2*i]
v1, _ := strconv.ParseInt(sub1, 16, 0)
v2, _ := strconv.ParseInt(sub2, 16, 0)
v := (v1 + v2) / 2
sub := fmt.Sprintf("%02X", v)
copy(buf[1+2*i:3+2*i], sub)
}
c := string(buf[:])
Loops over each component r, g, b.
For conciseness this assumes that input validity has already been checked, so we omit some returned errors.
For conciseness this assumes that input validity has already been checked, so we omit some returned errors.
r1, _ := strconv.ParseInt(c1[1:3], 16, 0)
r2, _ := strconv.ParseInt(c2[1:3], 16, 0)
r := (r1 + r2) / 2
g1, _ := strconv.ParseInt(c1[3:5], 16, 0)
g2, _ := strconv.ParseInt(c2[3:5], 16, 0)
g := (g1 + g2) / 2
b1, _ := strconv.ParseInt(c1[5:7], 16, 0)
b2, _ := strconv.ParseInt(c2[5:7], 16, 0)
b := (b1 + b2) / 2
c := fmt.Sprintf("#%02X%02X%02X", r, g, b)
For conciseness this assumes that input validity has already been checked, so we omit some returned errors.
var c = "#";
for(var i = 0; i<3; i++) {
var sub1 = c1.substring(1+2*i, 3+2*i);
var sub2 = c2.substring(1+2*i, 3+2*i);
var v1 = parseInt(sub1, 16);
var v2 = parseInt(sub2, 16);
var v = Math.floor((v1 + v2) / 2);
var sub = v.toString(16).toUpperCase();
var padsub = ('0'+sub).slice(-2);
c += padsub;
}
String r1 = c1.substring(1,3);
String g1 = c1.substring(3,5);
String b1 = c1.substring(5,7);
String r2 = c2.substring(1,3);
String g2 = c2.substring(3,5);
String b2 = c2.substring(5,7);
String r = String.format("%02X", (Integer.parseInt(r1, 16)+Integer.parseInt(r2, 16))/2 );
String g = String.format("%02X", (Integer.parseInt(g1, 16)+Integer.parseInt(g2, 16))/2 );
String b = String.format("%02X", (Integer.parseInt(b1, 16)+Integer.parseInt(b2, 16))/2 );
String c = "#" + r + g + b;
StringBuilder sb = new StringBuilder("#");
for(int i=0;i<3;i++) {
String sub1 = c1.substring(1+2*i,3+2*i);
String sub2 = c2.substring(1+2*i,3+2*i);
int v1 = Integer.parseInt(sub1, 16);
int v2 = Integer.parseInt(sub2, 16);
int v = (v1 + v2)/2;
String sub = String.format("%02X", v);
sb.append(sub);
}
String c = sb.toString();
Loops over each component r, g, b.
Color x = decode(c1), y = decode(c2);
int r = (x.getRed() + y.getRed()) / 2,
g = (x.getGreen() + y.getGreen()) / 2,
b = (x.getBlue() + y.getBlue()) / 2,
z = (r << 16) + (g << 8) + b;
String c = "#%06x".formatted(z);
var
c1, c2: string;
RGB1, RGB2: LongInt;
R1, G1, B1, R2, G2, B2: Byte;
c: TColor;
begin
RGB1 := ColorToRGB(StrToInt(StringReplace(c1,'#','$',[])));
RGB1 := ColorToRGB(StrToInt(StringReplace(c2,'#','$',[])));
RedGreenBlue(RGB1, R1, G1, B1);
RedGreenBlue(RGB2, R2, G2, B2);
c := RGBToColor(R1+R2 div 2, G1+G2 div 2, B1+B2 div 2);
end.
No error checking on input (c1, c2) is done.
PROBLEM: c must be a string, not a TColor.
PROBLEM: c must be a string, not a TColor.
my @c1 = unpack 'xA2A2A2', $c1;
my @c2 = unpack 'xA2A2A2', $c2;
my $c = sprintf '#%02X%02X%02X', pairwise { (hex($a) + hex($b)) / 2 } @c1, @c2
class RGB(numpy.ndarray):
@classmethod
def from_str(cls, rgbstr):
return numpy.array([
int(rgbstr[i:i+2], 16)
for i in range(1, len(rgbstr), 2)
]).view(cls)
def __str__(self):
self = self.astype(numpy.uint8)
return '#' + ''.join(format(n, 'x') for n in self)
c1 = RGB.from_str('#a1b1c1')
print(c1)
c2 = RGB.from_str('#1A1B1C')
print(c2)
print((c1 + c2) / 2)
numpy is standard for array numerics, and works nicely for this problem. We can represent a RGB value as a special numpy array.
rgbs = c1[1..-1].scan(/../), c2[1..-1].scan(/../)
c = "#%02X%02X%02X" % rgbs.transpose.map{|h1, h2| (h1.hex + h2.hex)/2 }