Как найти значение цвета RGBA из двух значений RGB? - PullRequest
3 голосов
/ 29 марта 2011

У меня есть предчувствие, что это было сделано раньше, но я совершенно непрофессионал в этом и не знаю, как начать задавать правильный вопрос.Поэтому я опишу, что я пытаюсь сделать ...

У меня неизвестный цвет ARGB.Я знаю только его абсолютное значение RGB, отображаемое на двух известных непрозрачных цветах фона, например, черном 0x000000 и белом 0xFFFFFF.Итак, чтобы продолжить пример, если я знаю, что цвет ARGB равен RGB 0x000080 при отображении более 0x000000, и я знаю, что тот же цвет ARGB равен RGB 0x7F7FFF при отображении более 0xFFFFFF, есть ли способ вычислить, какой исходный цвет ARGBэто?

или это вообще возможно ???

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Итак, вы знаете, что если положить (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.

1 голос
/ 29 марта 2011

Выбор черного и белого в качестве цветов фона - лучший выбор как для простоты расчета, так и для точности результата. С большим количеством злоупотреблений нотацией ....

  • a (RGB) + (1-a) 0xFFFFFF = 0x7F7FFF
  • a (RGB) + (1-a) 0x000000 = 0x000080

Вычитая второе из первого ...

  • (1-а) 0xFFFFFF = 0x7F7FFF-0x000080 = 0x7F7F7F

So

  • (1-а) = 0x7F / 0xFF
  • a = (0xFF-0x7F) / 0xFF = 0x80 / ​​0xFF
  • A = 0x80

и RGB = (a (RGB)) / a = 0x000080 / a = 0x0000FF

Вы можете сделать что-то очень похожее с другими вариантами выбора цвета фона. Чем меньше значение a и чем ближе два цвета фона, тем менее точно вы сможете определить значение RGBA. Рассмотрим крайние случаи, когда A = 0 или два цвета фона одинаковы.

...