Итак, вы знаете, что если положить (a, r, g, b) над (r1, g1, b1), то вы получите (R1, G1, B1), а если положить его (r2, g2, b2), то вы получите (R2, G2, B2).Другими словами - случайно я собираюсь работать здесь в единицах, где диапазоны от 0 до 1 - вы знаете (1-a) r1 + ar = R1, (1-a) r2 + ar = R2 и т. Д.Возьмите эти два и вычтите: вы получаете (1-a) (r1-r2) = R1-R2 и, следовательно, a = 1- (R1-R2) / (r1-r2).Как только вы знаете a, вы можете решить все остальное.
На самом деле вы должны вычислить значения a, которые вы получите, выполнив эти вычисления для всех трех из {R, G, B}, и усреднить их или что-то еще, чтобыуменьшить влияние ошибки округления.На самом деле, я бы рекомендовал взять знак = 1 - [(R1-R2) (r1-r2) + (G1-G2) (g1-g2) + (B1-B2) (b1-b2)]/ (| r1-r2 | + | g1-g2 | + | b1-b2), что означает более высокий вес более надежных цветов.
Теперь у вас есть, например, r = (R1- (1)-a) r1) / a = (R2- (1-a) r2) / a.Эти два были бы равны, если бы у вас были значения бесконечной точности для a, r, g, b, но, конечно, на практике они могут немного отличаться.Усредните их: r = [(R1 + R2) - (1-a) (r1 + r2)] / 2a.
Если ваше значение a очень мало, вы получите только довольно ненадежныеинформация о г, г, б.(В пределе, где a = 0, вы вообще не получите никакой информации, и вы, очевидно, ничего не можете с этим поделать.) Возможно, что вы можете получить числа вне диапазона 0..255, в этом случае я не делаюЯ думаю, вы можете добиться большего, чем просто вырезать.
Вот как это работает для вашего конкретного примера.(R1, G1, B1) = (0,0,0);(Г2, g2, b2) = (255,255,255);(R1, G1, B1) = (0,0,128);(R2, G2, B2) = (127127255).Таким образом, a = 1 - [127 + 127 + 127] / [255 + 255 + 255] = 128/255, что является одним из 256 фактически возможных значений a.(Если это не так, мы, вероятно, должны округлить его на этом этапе.)
Теперь r = (127-255 * 127/255) * 255/256 = 0;аналогично g = 0;и b = (383-255 * 127/255) * 255/256 = 255.
Таким образом, наш цвет ARGB был 80,00,00, FF.