Этот фрагмент кода был преобразован из моего собственного Pascal кода, написанного в 1999 году для работы с программой просмотра .ICO .... Он фактически уменьшает глубину цвета с 256 до 16 цветов.
Вот что написано в C#:
Я с трудом понимаю логику c, стоящую за кодом, и не могу объяснить читателям GitHub, что это за важная часть для моего изображения (красочное) ASCII конвертер ....
Что я знаю, так это то, что он принимает значения RGB и возвращает (16-цветный) цветовой код (ConsoleColor в C#). Мне нужна дополнительная помощь в понимании этого.
Это может иметь какое-то отношение к странному Pascal способу оценки условия и вложенной итерационной конструкции ....
static int SimplifyColorComponent(int Value)
{
if (Value >= 52)
return 63;
else if (Value >= 32)
return 42;
else if (Value >= 12)
return 21;
return 0;
}
static byte DecreaseColor256(byte Red, byte Green, byte Blue)
{
byte[,] Palette16 = new byte[16,3] { {0, 0, 0 }, {0, 0, 42 }, {0, 42, 0 }, {0, 42, 42 }, { 42, 0, 0 }, {42, 0, 42}, {42, 42, 0}, {42, 42, 42}, { 0, 0, 21}, {0, 0, 63}, {0, 42, 21}, {0, 42, 63}, { 42, 0, 21}, { 42, 0, 63}, { 42, 42, 21}, { 42, 42, 63} };
byte Color;
byte Component;
byte Value = 0;
byte NewRed = 0;
byte NewGreen = 0;
byte NewBlue = 0;
for (Component = 0; Component <= 2; Component++)
{
if (Component == 0)
Value = (byte)SimplifyColorComponent(Red / 4);
else if (Component == 1)
Value = (byte)SimplifyColorComponent(Green / 4);
else if (Component == 2)
Value = (byte)SimplifyColorComponent(Blue / 4);
Color = 0;
while (Value != Palette16[Color, Component])
{
Color++;
if (Color > 15)
{
Value -= 21;
Color = 0;
}
}
if (Component == 0)
NewRed = Value;
else if (Component == 1)
NewGreen = Value;
else if (Component == 2)
NewBlue = Value;
}
for (Color = 0; Color <= 15; Color++)
if ((Palette16[Color, 0] == NewRed) && (Palette16[Color, 1] == NewGreen) && (Palette16[Color, 2] == NewBlue))
return Color;
return 0;
}
Преобразованная строка за строкой из моего старого Pascal кода :
function SimplifyColorComponent(Value:byte):byte;
begin
if Value>=52 then
SimplifyColorComponent:=63
else
if Value>=32 then
SimplifyColorComponent:=42
else
if Value>=12 then
SimplifyColorComponent:=21
else
SimplifyColorComponent:=0;
end;
function DecreaseColor256(Red,Green,Blue:byte):byte;
const
Palette16:array [0..15,1..3] of byte=((0,0,0),(0,0,42),(0,42,0),(0,42,42),
(42,0,0),(42,0,42),(42,42,0),(42,42,42),
(0,0,21),(0,0,63),(0,42,21),(0,42,63),
(42,0,21),(42,0,63),(42,42,21),(42,42,63));
var
Color,Component,Value:byte;
NewRed,NewGreen,NewBlue:byte;
begin
DecreaseColor256:=0;
Component:=1;
repeat
case Component of
1:Value:=SimplifyColorComponent(Red div 4);
2:Value:=SimplifyColorComponent(Green div 4);
3:Value:=SimplifyColorComponent(Blue div 4);
end;
Color:=0;
while Value<>Palette16[Color,Component] do
begin
Inc(Color);
if Color>15 then
begin
Dec(Value,21);
Color:=0;
end;
end;
case Component of
1:NewRed:=Value;
2:NewGreen:=Value;
3:NewBlue:=Value;
end;
Inc(Component);
until Component>3;
for Color:=0 to 15 do
if (Palette16[Color,1]=NewRed) and (Palette16[Color,2]=NewGreen)
and (Palette16[Color,3]=NewBlue) then
begin
DecreaseColor256:=Color;
Exit;
end;
end;