Может кто-нибудь объяснить логи c моего кода в обработке глубины цвета? - PullRequest
0 голосов
/ 20 марта 2020

Этот фрагмент кода был преобразован из моего собственного 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;
...