Преобразование ARBG в RGB с альфа-смешением на белом фоне - PullRequest
2 голосов
/ 01 июня 2011

У меня есть цветная шестнадцатеричная строка, хранящаяся в базе данных, как 0x78dce6b0;Я могу преобразовать это в цвет ARGB, используя:

string colorString=0x78dce6b0;
int hexColor = Convert.ToInt32(colorString ?? "0", 16);
Color colorTL = Color.FromArgb(hexColor);

Теперь я хочу преобразовать это для использования на странице HTML, поэтому мне нужно преобразовать в значение HTML, например #cc3388.Если я конвертирую напрямую, используя ColorTranslator.ToHtml(colorTL), я теряю значение альфа-смешения.Как я могу преобразовать это, принимая во внимание альфа-значение, предполагая, что фон всегда белый?

Ответы [ 3 ]

3 голосов
/ 01 июня 2011

HTML-цвета не имеют компонента Alpha.

К сожалению, невозможно ARGB преобразовать в HTML RGB без потери компонента Alpha.

Если вы хотите смешать свой цвет с белым, основываясь на вашем альфа-значении ...

  • Преобразовать каждый шестнадцатеричный компонент (A, R, G, B) в значение от 0 до 255, где значение FF равно 255, 00 равно 0.
  • Мы назовем эти 0-255 значений, A, R, G, B
  • Предположим, что значение Alpha 255 означает «полностью прозрачный», а значение Alpha 0 означает «полностью непрозрачный»
  • New_R = CInt ((255 - R) * (A / 255.0) + R)
  • New_G = CInt ((255 - G) * (A / 255.0) + G)
  • New_B = CInt ((255 - G) * (A / 255.0) + B)
  • Ваша окончательная цветовая строка HTML будет: "#" & cstr (New_R) & cstr (New_G) & cstr (New_B)
1 голос
/ 08 ноября 2013

Ни один из предложенных вариантов не работал для меня, но затем использовал http://en.wikipedia.org/wiki/Alpha_compositing, чтобы придумать это:

var useColor = Color.FromArgb(
                (int)((theStructureColor.R) * (theStructureColor.A / 255.0) + 255 - theStructureColor.A),
                (int)((theStructureColor.G) * (theStructureColor.A / 255.0) + 255 - theStructureColor.A),
                (int)((theStructureColor.B) * (theStructureColor.A / 255.0) + 255 - theStructureColor.A));
0 голосов
/ 01 июня 2011

Итак, что вы действительно делаете, так это комбинируете белый фон с полупрозрачным цветом переднего плана и вычисляете полученный цвет дисплея.Похоже, что это дублирующий вопрос Рассчитайте полученный RGB из 2 цветов, один из которых прозрачен , где был опубликован подходящий ответ.Чтобы применить это к вашей ситуации, это будет что-то вроде следующего (обратите внимание, я не проверял этот код):

public static Color FromTransparentWithWhiteBG(Color A)
{
    // Assuming Alpha is a value between 0 and 254...
    var aFactor = (A.A/254);
    var bgAFactor = (1-(A.A/254));
    var background = Color.White;
    var R_c = (Int32)(Math.Ceiling((Double)A.R * aFactor) + Math.Ceiling ((Double)background.R * (1 - bgAFactor )));
    var G_c = (Int32)(Math.Ceiling((Double)A.G * aFactor) + Math.Ceiling ((Double)background.G * (1 - bgAFactor )));
    var B_c = (Int32)(Math.Ceiling((Double)A.B * aFactor) + Math.Ceiling ((Double)background.B * (1 - bgAFactor )));
    return Color.FromArgb(1, R_c, G_c, B_c);
}
...