返回
{***************************************************************}
{***               FVision Unit Version1.0                   ***}
{***                    蓝蚂蚁工作室                         ***}
{***************************************************************}
{***                    图像处理单元                         ***}
{***************************************************************}
Unit FConCol;
Interface
Uses
  Dos,Graph,FGraph,Ftool,FDac,FCutGra,SvgaDrv;

procedure ConvertCutFile(Name:PathStr);
Implementation
const
  StandCol:array[1..48] of Byte=
           (0,0,0, 0,0,42, 0,42,0, 0,42,42, 42,0,0, 42,0,42,
            42,21,0, 42,42,42, 21,21,21, 21,21,63, 21,63,21,
            21,63,63, 63,21,21, 63,21,63, 63,63,21, 63,63,63);
var
  New_Dac:DacType;
  Used:Integer;
  ColUse,OrderC:ColorUseType;
  Les:array[0..15] of Integer;
  Con:array[0..255] of Integer;

procedure OrderColor;
var
  i,j,k:Integer;
  Find:Boolean;
begin
  for i:=0 to 15 do
  begin
    Les[i]:=0;
    for j:=0 to 255 do
    if (j<>Les[i])and(ColUse[j]<ColUse[Les[i]]) then
    begin
      Find:=True;
      for k:=0 to i-1 do
      if j=Les[k] then Find:=False;
      if Find then Les[i]:=j;
    end;
  end;
end;

function InLesColor(Ind:Integer):Boolean;
var
  i:Integer;
begin
  InLesColor:=False;
  for i:=0 to 15 do
  if Les[i]=Ind then
  begin
    InLesColor:=True;
    Exit;
  end;
end;

function SubstColor(Ind:Integer):Integer;
var
  Temp,OldTemp,TempColor,i:Integer;
begin
  OldTemp:=1000;
  TempColor:=16;
  for i:=16 to 255 do
  if not InLesColor(i) then
  begin
    Temp:=Abs(New_Dac[Ind*3+1]-New_Dac[i*3+1])+
          Abs(New_Dac[Ind*3+2]-New_Dac[i*3+2])+
          Abs(New_Dac[Ind*3+3]-New_Dac[i*3+3]);
    if Temp<OldTemp then
    begin
      TempColor:=i;
      OldTemp:=Temp;
    end;
  end;
  SubstColor:=TempColor;
end;

procedure ConvertCutFile(Name:PathStr);
var
  i,j,Color:Integer;
begin
  Dac.GetDac(New_Dac);
  Used:=GetUseColor(0,0,Maxx+1,Maxy+1,ColUse);
  OrderColor;
  for i:=0 to 15 do
  Move(New_Dac[i*3+1],New_Dac[Les[i]*3+1],3);
  Move(StandCol,New_Dac,48);
  for i:=0 to 255 do
    Con[i]:=SubstColor(i);
  for i:=0 to Maxx do
  for j:=0 to Maxy do
  begin
    Color:=GetPixel8(i,j);
    if Color<16 then
    begin
      if Les[Color]<16 then
        PutPixel8(i,j,Con[Color])
      else
        PutPixel8(i,j,Les[Color]);
    end else
    if InLesColor(Color) then
      PutPixel8(i,j,Con[Color]);
  end;
  Dac.SetNewDac(New_Dac);
  GetCutGra(Name);
end;

end.