I am trying to get an interpolation of one color to another shade of the same color. (for eg: sky blue to dark blue and then back).
I stumbled upon some code that could be used if the range was from 0-255 or 0-1. However, in my case, I have the RGB codes for Color1 and Color2, and want the rotation to occur.
Color 1: 151,206,255
Color 2: 114,127,157
Any ideas how to go about this?
The color-interpolation attribute specifies the color space for gradient interpolations, color animations, and alpha compositing. Note: For filter effects, the color-interpolation-filters property controls which color space is used.
The formula is y = y1 + ((x - x1) / (x2 - x1)) * (y2 - y1), where x is the known value, y is the unknown value, x1 and y1 are the coordinates that are below the known x value, and x2 and y2 are the coordinates that are above the x value.
When you interject your opinion into a conversation that two other people are having, this is a time when you interpolate. When you insert words or letters into text, this is an example of a time when you interpolate.
There’s nothing wrong in using these functions, as long as you know what the deal with colour interpolation is. Interpolation is a technique that allows you to “fill a gap” between two numbers.
The interpolate method allows a user to create a linear interpolation function using two or more colors. A returned interpolation function accepts an input between 0 - 1 and will cause a new color between the specified colors to be returned.
When used in the context of color, it is finding one or more colors that reside between any two given colors. This is often used to simulate mixing colors, creating gradients, or even create color palettes. ColorAide provides a number of useful utilities based on interpolation.
The program interpolates the color yellow, from red and green. The input and output is in RGB-space, but the interpolation is handled in the HSV-space. I also added an RGB interpolation example. As you can see below, a dark-yellow is produced if you interpolate red and green in RGB-space.
I suggest you convert RGB to HSV, then adjust its components, then convert back to RGB.
Wikipedia has an article about it, and it's been discussed here before:
HSL to RGB color conversion
Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both
Also many frameworks have conversion functions, for example Qt has QColor class.
But the question was about the actual interpolation... here's a trivial interpolation function:
// 0 <= stepNumber <= lastStepNumber
int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber)
{
return (endValue - startValue) * stepNumber / lastStepNumber + startValue;
}
So call that for all color components you want to interpolate, in a loop. With RBG interpolation, you need to interpolate every component, in some other color space you may need to interpolate just one.
I know this is little bit old, but is worthy if someone is searching for it.
First of all, you can do interpolation in any color space, including RGB, which, in my opinion, is one of the easiest.
Let's assume the variation will be controlled by a fraction value between 0 and 1 (e.g. 0.3), where 0 means full color1 and 1 means full color2.
The theory:
Result = (color2 - color1) * fraction + color1
Applying:
As the RGB has 3 channels (red, green and blue) we have to perform this math for each one of the channels.
Using your example colors:
fraction: 0.3
color1: 151,206,255
color2: 114,127,157
R = (114-151) * fraction + 151
G = (127-206) * fraction + 206
B = (157-255) * fraction + 255
Code example in C/C++:
/**
* interpolate 2 RGB colors
* @param color1 integer containing color as 0x00RRGGBB
* @param color2 integer containing color as 0x00RRGGBB
* @param fraction how much interpolation (0..1)
* - 0: full color 1
* - 1: full color 2
* @return the new color after interpolation
*/
int interpolate(int color1, int color2, float fraction)
{
unsigned char r1 = (color1 >> 16) & 0xff;
unsigned char r2 = (color2 >> 16) & 0xff;
unsigned char g1 = (color1 >> 8) & 0xff;
unsigned char g2 = (color2 >> 8) & 0xff;
unsigned char b1 = color1 & 0xff;
unsigned char b2 = color2 & 0xff;
return (int) ((r2 - r1) * fraction + r1) << 16 |
(int) ((g2 - g1) * fraction + g1) << 8 |
(int) ((b2 - b1) * fraction + b1);
}
/*
* 0x0097ceff == RGB(151,206,255)
* 0x00727f9d == RGB(114,127,157)
*/
int new_color = interpolate(0x0097ceff, 0x00727f9d, 0.3f);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With