Я заметил, что моя процедура преобразования между 24-битным и 16-битным RGB565 RGB888 приводила к постепенному затемнению цветов при каждом преобразовании ... Формула использует линейную интерполяцию, например, так ...
typedef struct _RGB24 RGB24;
struct _RGB24 {
BYTE B;
BYTE G;
BYTE R;
};
RGB24 *s; // source
WORD *d; // destination
WORD r;
WORD g;
WORD b;
// Code to convert from 24-bit to 16 bit
r = (WORD)((double)(s[x].r * 31) / 255.0);
g = (WORD)((double)(s[x].g * 63) / 255.0);
b = (WORD)((double)(s[x].b * 31) / 255.0);
d[x] = (r << REDSHIFT) | (g << GREENSHIFT) | (b << BLUESHIFT);
// Code to convert from 16-bit to 24-bit
s[x].r = (BYTE)((double)(((d[x] & REDMASK) >> REDSHIFT) * 255) / 31.0);
s[x].g = (BYTE)((double)(((d[x] & GREENMASK) >> GREENSHIFT) * 255) / 63.0);
s[x].b = (BYTE)((double)(((d[x] & BLUEMASK) >> BLUESHIFT) * 255) / 31.0);
Преобразование из 16-битного в 24-битное аналогично, но с обратной интерполяцией ... Я не понимаю, как значения продолжают уменьшаться и уменьшаться каждый раз, когда цвет циклически проходит по уравнению, если они противоположны... Первоначально не было бросков, чтобы удвоить, но я подумал, что если бы я сделал это деление с плавающей запятой, у него не было бы спада ... но это все равно ...