# How to get shades and tints of a color hex with Matlab?

12 views (last 30 days)
Sim on 10 May 2021
Commented: Sim on 11 May 2021
How can I get shades and tints of a color hex in an automatic way (maybe still represented as color hex, or also color rgb)? Is there any in-built function?
For example shades and tints of strong pink (#f907ff) ?
% input
strong_pink = '#f907ff';
% output (as in https://www.color-hex.com/color/f907ff)
'#f907ff', % <-- input
'#e006e5',
'#c705cc',
'#ae04b2',
'#950499',
'#7c037f',
'#630266',
'#4a024c',
'#310133',
'#180019',
'#000000'};
tints = {
'#f907ff' % < -- input
'#f91fff'
'#fa38ff'
'#fa51ff'
'#fb6aff'
'#fc83ff'
'#fc9bff'
'#fdb4ff'
'#fdcdff'
'#fee6ff'
'#ffffff'};

DGM on 11 May 2021
There are a number of ways you could do it. The simple way would be to just interpolate between that color tuple and white (or black) in RGB.
incolor = '#f907ff';
nsteps = 11;
% convert to a usable RGB tuple
incolor = incolor(incolor~='#');
incolor = hex2dec(reshape(incolor,2,3).').';
% calculate output colors
scale = linspace(1,0,nsteps);
tints = uint8(incolor + (255-incolor).*fliplr(scale).')
% convert outputs to char hex tuples
tintshex = [repmat('#',[nsteps 1]) reshape(dec2hex(reshape(tints.',[],1)).',6,[]).']
This is essentially the same method used by these tools:
You could also linearize the RGB values in some way prior to interpolating, or you could do the interpolation using a different color model. You could make it as complicated as you like. I didn't bother to see how exactly that website chose to do it.

Sim on 11 May 2021
However, the code you wrote here does not work for me, but I changed it and it is now working (I used just one file exchange to convert outputs to char hex tuples):
% input
incolor = '#f907ff' ;
nsteps = 11;
% convert to a usable RGB tuple
color = sscanf(incolor(2:end),'%2x%2x%2x',[1 3])/255;
% calculate output colors
scale = linspace(1,0,nsteps);
color_inv = (1-color);
tints = fliplr(scale) .* color_inv(:) + color(:);
figure
for i = 0 : nsteps-1
patch([0 10 10 0],[i i (i+1) (i+1)],shades(:,i+1)','edgecolor','none')
end
axis tight
% plot tints
figure
for i = 0 : nsteps-1
patch([0 10 10 0],[i i (i+1) (i+1)],tints(:,i+1)','edgecolor','none')
end
axis tight
% convert outputs to char hex tuples
% https://ch.mathworks.com/matlabcentral/fileexchange/46289-rgb2hex-and-hex2rgb
tints_hex = rgb2hex(tints')
The result is the following:
11×7 char array
'#F907FF'
'#E006E6'
'#C706CC'
'#AE05B3'
'#950499'
'#7D0480'
'#640366'
'#4B024D'
'#320133'
'#190119'
'#000000'
tints_hex =
11×7 char array
'#F907FF'
'#FA20FF'
'#FA39FF'
'#FB51FF'
'#FB6AFF'
'#FC83FF'
'#FD9CFF'
'#FDB5FF'
'#FECDFF'
'#FEE6FF'
'#FFFFFF'
##### 2 CommentsShowHide 1 older comment
Sim on 11 May 2021
Thanks a lot, very kind! :)