Advertisement
varden

ColorConverter

Dec 12th, 2011
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 16.96 KB | None | 0 0
  1. {------------------------------}
  2. {      Wojciech Gancarz        }
  3. {     Informatyka, Rok I       }
  4. {          Grupa IV            }
  5. {                              }
  6. {     Konwerter RGB/HSV/YUV    }
  7. {------------------------------}
  8.  
  9. {-------------------------------------------------------------------------------------------------------}
  10. { Program pobiera z pliku skladowe koloru w 1 z 3 modeli barw (RGB,HSV,YUV), wylicza skladowe           }
  11. { pozostalych 2 modeli dla tego koloru i zapisuje do innego pliku.                                      }
  12. {                                                                                                       }
  13. { Dla RGB: wszystkie skladowe musza byc calkowite i nalezec do <0,255>'                                 }
  14. { Dla YUV: Y musi byc calkowite i nalezec do <0,255>. U,V musza byc calkowite i nalezec do <-127,128>.' }
  15. { Dla HSV: H musi nalezec do <0,360). S,V musza nalezec do <0,1>.                                       }
  16. {                                                                                                       }
  17. { Skladowe w pliku musza byc poprzedzone nazwa modelu i dwukropkiem, rozdzielone przecinkiem            }
  18. { i zakonczone srednikiem. Przyklad tresci pliku:                                                       }
  19. {                                                                                                       }
  20. { RGB:45,99,114;                                                                                        }
  21. { YUV:218,-125,3;                                                                                       }
  22. { rgb:200,100,114;                                                                                      }
  23. { hsv:312,0.81,0.9114;                                                                                  }
  24. {-------------------------------------------------------------------------------------------------------}
  25. program colorconvert2;
  26.  
  27. uses crt, sysutils, math;
  28.  
  29. type
  30.     arrayint = array[1..3] of integer;
  31.     arrayext = array[1..3] of extended;
  32.    
  33. var
  34.     source,output:text;                                                                                 {source - plik wejsciowy; output - plik wyjsciowy}
  35.     filename:string;                                                                                    {nazwa pliku}
  36.     input:string;                                                                                       {linia tekst w pliku wejsciowym}
  37.     dataexists:boolean;                                                                                 {informuje czy poprawne dane zostaly znalezione}
  38.     nopoint:boolean;                                                                                    {informuje czy w liczbie skladowej wystapil juz przecinek}
  39.     i,j,k:integer;                                                                                      {do inkrementacji}
  40.     current: array[1..3] of string;                                                                     {tablica 3 stringow ze skladowymi koloru}
  41.     rgb: arrayint;                                                                                      {tablica skladowych rgb}
  42.     hsv: arrayext;                                                                                      {tablica skladowych hsv}
  43.     yuv: arrayint;                                                                                      {tablica skladowych yuv}
  44.  
  45. function FileNameCorrect(s:string):boolean;                                                             {sprawdza poprawnosc nazwy pliku}
  46.     var
  47.         t:string;
  48.         LegalCharacterExists:boolean;
  49.     begin
  50.         FileNameCorrect:=true;
  51.         LegalCharacterExists:=false;
  52.         if length(s)=0 then FileNameCorrect:=false;
  53.         for i:=1 to length(s) do
  54.         begin
  55.             if ((s[i]='/') OR (s[i]='\') OR(s[i]=':') OR (s[i]='*') OR (s[i]='?') OR (s[i]='<') OR (s[i]='>') OR (s[i]='|') OR (s[i]='"')) then begin FileNameCorrect:=false; break; end
  56.             else if ((s[i]=' ') and (i=length(s)) and (LegalCharacterExists=false)) then begin FileNameCorrect:=false; break; end
  57.             else if ((s[i]=' ') and (i<>length(s))) then
  58.                 begin
  59.                     t:=s;
  60.                     delete(t,1,i);
  61.                     FileNameCorrect:=FileNameCorrect(t);
  62.                 end
  63.             else LegalCharacterExists:=true;
  64.         end;
  65.     end;
  66.  
  67. function min(x,y:extended):extended;                                                                    {znajduje minimum}
  68.     begin
  69.         if x<=y then min:=x
  70.         else min:=y
  71.     end;
  72.  
  73. function max(x,y:extended):extended;                                                                    {znajduje maksimum}
  74.     begin
  75.         if x>=y then max:=x
  76.         else max:=y
  77.     end;
  78.  
  79. function RGBtoHSV(rgb:arrayint):arrayext;                                                               {funkcja pobiera tablice trzyelementowa (integer) skladajaca sie z 3 skladowych RGB (rgb[1]=R, rgb[2]=G, rgb[3]=B)}
  80.     var                                                                                                 {funkcja zwraca tablice trzyelementowa (extended) skladajaca sie z 3 skladowych HSV (hsv[1]=H, hsv[2]=S, hsv[3]=V)}
  81.         datacorrect:boolean;                                                                            {gdy dane RGB sa bledne, funkcja zwraca H=-1, S=0, V=0}
  82.         rgb_min,rgb_max:extended;                                                                      
  83.         r,g,b,h,s,v:extended;
  84.  
  85.     begin
  86.         r:=rgb[1];
  87.         g:=rgb[2];
  88.         b:=rgb[3];
  89.         datacorrect:=true;
  90.         if ((r<0) OR (r>255)) then datacorrect:=false                                                   {sprawdza poprawnosc skladowej R}
  91.         else if ((g<0) OR (g>255)) then datacorrect:=false                                              {sprawdza poprawnosc skladowej G}
  92.         else if ((b<0) OR (b>255)) then datacorrect:=false;                                             {sprawdza poprawnosc skladowej B}
  93.         if datacorrect=true then begin
  94.             rgb_min:=min(min(r,g),b);
  95.             rgb_max:=max(max(r,g),b);
  96.             v:=rgb_max;
  97.             if v=0 then begin h:=0; s:=0; end
  98.             else begin
  99.                 r:=r/255;
  100.                 g:=g/255;
  101.                 b:=b/255;
  102.                 rgb_min:=min(min(r,g),b);
  103.                 rgb_max:=max(max(r,g),b);
  104.                 v:=rgb_max;
  105.                 if v=0 then begin h:=0; s:=0; end
  106.                 else begin
  107.                     r:=(r/v);
  108.                     g:=(g/v);        
  109.                     b:=(b/v);
  110.                     rgb_min:=min(min(r,g),b);
  111.                     rgb_max:=max(max(r,g),b);
  112.                     s:=rgb_max-rgb_min;
  113.                     if s=0 then h:=0
  114.                     else begin
  115.                         r:=(r-rgb_min)/(rgb_max-rgb_min);
  116.                         g:=(g-rgb_min)/(rgb_max-rgb_min);
  117.                         b:=(b-rgb_min)/(rgb_max-rgb_min);
  118.                         rgb_min:=min(min(r,g),b);
  119.                         rgb_max:=max(max(r,g),b);
  120.                         if rgb_max=r then begin
  121.                             h:=60*(g-b);
  122.                             if h<0 then h:=(h-360);
  123.                         end
  124.                         else if rgb_max=g then h:=(120+60*(b-r))
  125.                         else h:=(240+60*(r-g));
  126.                     end;
  127.                 end;
  128.             end;
  129.         end
  130.         else {datacorrect=false} begin
  131.             h:=-1; {blad:bledne dane wejsciowe}
  132.             s:=0;
  133.             v:=0;
  134.         end;
  135.         RGBtoHSV[1]:=h;
  136.         RGBtoHSV[2]:=s;
  137.         RGBtoHSV[3]:=v;
  138.     end;
  139.  
  140. function RGBtoYUV(rgb:arrayint):arrayint;                                                               {funkcja pobiera tablice trzyelementowa (integer) skladajaca sie z 3 skladowych RGB (rgb[1]=R, rgb[2]=G, rgb[3]=B)}
  141.     var                                                                                                 {funkcja zwraca tablice trzyelementowa (integer) skladajaca sie z 3 skladowych YUV (yuv[1]=Y, yuv[2]=S, yuv[3]=V)}
  142.         r,g,b,y,u,v:extended;                                                                           {gdy dane RGB sa bledne, funkcja zwraca Y=-1, U=0, V=0}
  143.         datacorrect:boolean;                                                                               
  144.        
  145.     begin
  146.         r:=rgb[1];
  147.         g:=rgb[2];
  148.         b:=rgb[3];
  149.         datacorrect:=true;
  150.         if ((r<0) OR (r>255)) then datacorrect:=false                                                   {sprawdza poprawnosc skladowej R}
  151.         else if ((g<0) OR (g>255)) then datacorrect:=false                                              {sprawdza poprawnosc skladowej G}
  152.         else if ((b<0) OR (b>255)) then datacorrect:=false;                                             {sprawdza poprawnosc skladowej B}
  153.         if datacorrect=true then begin
  154.             y:=(0.299*r+0.587*g+0.114*b);
  155.             u:=(b-y);
  156.             v:=(r-y);
  157.         end
  158.         else {datacorrect=false} begin
  159.             y:=-1; {blad:bledne dane wejsciowe}
  160.             u:=0;
  161.             v:=0;
  162.         end;
  163.         RGBtoYUV[1]:=Round(y);
  164.         RGBtoYUV[2]:=Round(u);
  165.         RGBtoYUV[3]:=Round(v);
  166.     end;
  167.  
  168. function HSVtoRGB(hsv:arrayext):arrayint;                                                               {funkcja pobiera tablice trzyelementowa (extended) skladajaca sie z 3 skladowych HSV (hsv[1]=H, hsv[2]=S, hsv[3]=V)}
  169.     var                                                                                                 {funkcja zwraca tablice trzyelementowa (integer) skladajaca sie z 3 skladowych RGB (rgb[1]=R, rgb[2]=G, rgb[3]=B)}
  170.         datacorrect:boolean;                                                                            {gdy dane HSV sa bledne, funkcja zwraca R=-1, G=0, B=0}
  171.         h,s,v,r,g,b,i,f,p,q,t:extended;
  172.     begin
  173.         h:=hsv[1];
  174.         s:=hsv[2];
  175.         v:=hsv[3];
  176.         datacorrect:=true;
  177.         if ((h<0) OR (h>=360)) then datacorrect:=false                                                  {weryfikacja poprawnosci H}
  178.         else if ((s<0) OR (s>1)) then datacorrect:=false                                                {weryfikacja poprawnosci S}
  179.         else if ((v<0) OR (v>1)) then datacorrect:=false;                                               {weryfikacja poprawnosci V}                        
  180.         if datacorrect=true then begin
  181.             if v=0 then begin r:=0; g:=0; b:=0; end
  182.             else begin
  183.                 h := h/60;
  184.                 i := Floor(h);
  185.                 f := h-i;
  186.                 p := v*(1-s);
  187.                 q := v*(1-(s*f));
  188.                 t := v*(1-(s*(1-f)));
  189.                 if i=0 then begin r:=v; g:=t; b:=p; end
  190.                 else if i=1 then begin r:=q; g:=v; b:=p; end
  191.                 else if i=2 then begin r:=p; g:=v; b:=t; end
  192.                 else if i=3 then begin r:=p; g:=q; b:=v; end
  193.                 else if i=4 then begin r:=t; g:=p; b:=v; end
  194.                 else if i=5 then begin r:=v; g:=p; b:=q; end;
  195.             end;
  196.             r:=(r*255);
  197.             g:=(g*255);
  198.             b:=(b*255);
  199.         end
  200.         else {datacorrect=false} begin
  201.             r:=-1; {blad:bledne dane wejsciowe}
  202.             g:=0;
  203.             b:=0;
  204.         end;
  205.         HSVtoRGB[1]:=Round(r);
  206.         HSVtoRGB[2]:=Round(g);
  207.         HSVtoRGB[3]:=Round(b);
  208.     end;
  209.  
  210. function YUVtoRGB(yuv:arrayint):arrayint;                                                               {funkcja pobiera tablice trzyelementowa (integer) skladajaca sie z 3 skladowych YUV (yuv[1]=Y, yuv[2]=U, yuv[3]=V)}
  211.     var                                                                                                 {funkcja zwraca tablice trzyelementowa (integer) skladajaca sie z 3 skladowych RGB (rgb[1]=R, rgb[2]=G, rgb[3]=B)}
  212.         datacorrect:boolean;                                                                            {gdy dane HSV sa bledne, funkcja zwraca R=-1, G=0, B=0}
  213.         y,u,v,r,g,b:extended;
  214.     begin
  215.         y:=yuv[1];
  216.         u:=yuv[2];
  217.         v:=yuv[3];
  218.         datacorrect:=true;
  219.         if ((y<0) OR (y>255)) then datacorrect:=false                                                   {sprawdzenie poprawnosci Y}
  220.         else if ((u<-128) OR (u>127)) then datacorrect:=false                                           {sprawdzenie poprawnosci U}
  221.         else if ((v<-128) OR (v>127)) then datacorrect:=false;                                          {sprawdzenie poprawnosci V}
  222.         if datacorrect=true then begin
  223.             b:=u+y;
  224.             r:=v+y;
  225.             g:=((y-(0.299*r)-(0.114*b))/0.587);
  226.             r:=Round(r);
  227.             g:=Round(g);
  228.             b:=Round(b);       
  229.         end
  230.         else begin
  231.             r:=-1;
  232.             g:=0;
  233.             b:=0;
  234.         end;
  235.         YUVtoRGB[1]:=Round(r);
  236.         YUVtoRGB[2]:=Round(g);
  237.         YUVtoRGB[3]:=Round(b);
  238.     end;
  239.  
  240. begin
  241.     clrscr;
  242.     DecimalSeparator:='.';                                                                              {oznaczenie przecinka w stringach dla StrToFloat}
  243.     writeln('Podaj nazwe pliku ze skladowymi kolorow. Skladowe musza byc sformatowane nastepujaco: "RGB:R,G,B;" i podobnie dla YUV oraz HSV.');
  244.     writeln('Dla RGB: wszystkie skladowe musza byc calkowite i nalezec do <0,255>');
  245.     writeln('Dla YUV: Y musi byc calkowite i nalezec do <0,255>. U,V musza byc calkowite i nalezec do <-127,128>.');
  246.     writeln('Dla HSV: H musi nalezec do <0,360). S,V musza nalezec do <0,1>.');
  247.     readln(filename);
  248.     if fileexists(filename)=false then writeln('Nie znaleziono pliku.')
  249.     else begin
  250.         if FileNameCorrect(filename)=false then writeln('Niepoprawna nazwa pliku.')
  251.         else begin
  252.             assign(source,filename);                                                                    {plik wejsciowy}
  253.             reset(source);
  254.             writeln('Podaj nazwe pliku dla wynikow. Pozostaw puste pole, jezeli chcesz wypisac wyniki w konsoli.');
  255.             readln(filename);                                                                           {plik wyjsciowy}
  256.             if FileNameCorrect(filename)=false then writeln('Niepoprawna nazwa pliku.')
  257.             else begin
  258.                 assign(output,filename);
  259.                 rewrite(output);
  260.                 dataexists:=false;                                                                      {na poczatku nie znaleziono zadnych skladowych}
  261.                 while not eof(source) do                                                                {czytanie danych pliku wejsciowego}
  262.                 begin
  263.                     readln(source,input);
  264.                     for i:=1 to (length(input)-3) do                                                   
  265.                     begin                                                                               {czesc znajdujaca skladowe RGB i wyliczajaca HSV oraz YUV}
  266.                         if ((input[i]='r') OR (input[i]='R')) AND ((input[i+1]='g') OR (input[i+1]='G')) AND ((input[i+2]='b') OR (input[i+2]='B')) AND (input [i+3]=':') then  {wyszukuje 'RGB:'}
  267.                         begin
  268.                             for k:=1 to 3 do current[k]:='0';                                           {zeruje 3 elementy tablicy}
  269.                             k:=1;
  270.                             for j:=i+4 to (length(input)) do
  271.                             begin
  272.                                 if ((input[j] >= '0') AND (input[j] <= '9')) then current[k]:=current[k]+input[j]   {dodaje do stringa kolejne cyfry}
  273.                                 else if ((input[j] = ',') AND (k>=1) AND (k<=2)) then                   {szuka przecinkow miedzy skladowymi, gdy wpisano mniej niz 2 skladowe}
  274.                                 begin
  275.                                     rgb[k]:=StrToInt(current[k]);                                       {zamienia string na integer i umieszcza w tablicy integerow}
  276.                                     k:=k+1;
  277.                                 end
  278.                                 else if ((input[j] = ';') AND (k=3)) then                               {wyszukuje srednika, ktory zamyka skladowe}
  279.                                 begin
  280.                                     rgb[k]:=StrToInt(current[k]);                                       {zamienia string na integer i umieszcza w tablicy integerow}
  281.                                     hsv:=RGBtoHSV(rgb);                                                 {wywoluje zamiane RGB na HSV}
  282.                                     if (hsv[1]<>(-1)) then begin                                        {jezeli dane sa poprawne}
  283.                                         yuv:=RGBtoYUV(rgb);                                             {wywoluje zamiane RGB na YUV}
  284.                                         writeln(output,'RGB:',rgb[1],',',rgb[2],',',rgb[3],';');        {wypisuje dane}
  285.                                         writeln(output,'HSV:',hsv[1]:1:0,',',hsv[2]:1:3,', ',hsv[3]:1:3,';');
  286.                                         writeln(output,'YUV:',yuv[1],',',yuv[2],',',yuv[3],';');
  287.                                         writeln(output);
  288.                                         dataexists:=true;                                               {znaleziono prawidlowe dane}
  289.                                     end;
  290.                                 end
  291.                                 else break;                                                             {gdy ktorys ze znakow jest niewlasciwy dla poprawnosci skladowych, przerywa petle i szuka kolejnych zestawow}
  292.                             end
  293.                         end
  294.                         {pozostale 2 czesci (HSV i YUV) dzialaja analogicznie do czesci wyszukujacej RGB}
  295.                         {czesc znajdujaca skladowe HSV i wyliczajaca RGB oraz YUV}
  296.                         else if ((input[i]='h') OR (input[i]='H')) AND ((input[i+1]='s') OR (input[i+1]='S')) AND ((input[i+2]='v') OR (input[i+2]='V')) AND (input [i+3]=':') then
  297.                         begin
  298.                             for k:=1 to 3 do current[k]:='0';
  299.                             k:=1;
  300.                             nopoint:=true;                                                              {nie znaleziono przecinka w liczbie}
  301.                             for j:=i+4 to (length(input)) do
  302.                             begin
  303.                                 if ((input[j] >= '0') AND (input[j] <= '9')) then current[k]:=current[k]+input[j]
  304.                                 else if ((input[j] = '.') AND nopoint=true) then
  305.                                 begin
  306.                                     current[k]:=current[k]+input[j];                                    {znaleziono i dopisano kropke}
  307.                                     nopoint:=false;                                                     {znaleziono kropke, kolejne nie moga wystapic}
  308.                                 end
  309.                                 else if ((input[j] = ',') AND (k>=1) AND (k<=2)) then
  310.                                 begin
  311.                                     hsv[k]:=StrToFloat(current[k]);
  312.                                     k:=k+1;
  313.                                     nopoint:=true;
  314.                                 end
  315.                                 else if ((input[j] = ';') AND (k=3)) then                               {zakonczono 3 skladowe}
  316.                                 begin
  317.                                     hsv[k]:=StrToFloat(current[k]);
  318.                                     rgb:=HSVtoRGB(hsv);
  319.                                     if (rgb[1]<>(-1)) then begin
  320.                                         yuv:=RGBtoYUV(rgb);
  321.                                         writeln(output,'HSV:',hsv[1]:1:0,',',hsv[2]:1:3,',',hsv[3]:1:3,';');
  322.                                         writeln(output,'RGB:',rgb[1],',',rgb[2],',',rgb[3],';');
  323.                                         writeln(output,'YUV:',yuv[1],',',yuv[2],',',yuv[3],';');
  324.                                         writeln(output);
  325.                                         dataexists:=true;
  326.                                     end;
  327.                                 end
  328.                                 else break;
  329.                             end;
  330.                         end
  331.                         {czesc znajdujaca skladowe YUV i wyliczajaca RGB oraz HSV}
  332.                         else if ((input[i]='y') OR (input[i]='Y')) AND ((input[i+1]='u') OR (input[i+1]='U')) AND ((input[i+2]='v') OR (input[i+2]='V')) AND (input [i+3]=':') then
  333.                         begin
  334.                             for k:=1 to 3 do current[k]:='0';
  335.                             k:=1;
  336.                             nopoint:=true;
  337.                             for j:=i+4 to (length(input)) do
  338.                             begin
  339.                                 if ((input[j]='-') AND ((input[j-1]=',') OR (input[j-1]=':'))) then current[k]:='-'
  340.                                 else if ((input[j] >= '0') AND (input[j] <= '9')) then current[k]:=current[k]+input[j]
  341.                                 else if ((input[j] = ',') AND (k>=1) AND (k<=2)) then
  342.                                 begin
  343.                                     yuv[k]:=StrToInt(current[k]);
  344.                                     k:=k+1;
  345.                                     nopoint:=true;
  346.                                 end
  347.                                 else if ((input[j] = ';') AND (k=3)) then
  348.                                 begin
  349.                                     yuv[k]:=StrToInt(current[k]);
  350.                                     rgb:=YUVtoRGB(yuv);
  351.                                     if (rgb[1]<>(-1)) then begin
  352.                                         hsv:=RGBtoHSV(rgb);
  353.                                         writeln(output,'YUV:',yuv[1],',',yuv[2],',',yuv[3],';');
  354.                                         writeln(output,'RGB:',rgb[1],',',rgb[2],',',rgb[3],';');
  355.                                         writeln(output,'HSV:',hsv[1]:1:0,',',hsv[2]:1:3,',',hsv[3]:1:3,';');
  356.                                         writeln(output);
  357.                                         dataexists:=true;
  358.                                     end;
  359.                                 end
  360.                                 else break;
  361.                             end;
  362.                         end;
  363.                     end;
  364.                 end;
  365.                 close(output);
  366.                 if dataexists=false then writeln('Nie znaleziono danych.');                             {nie wyliczono zadnych danych}
  367.             end;                                                                                       
  368.             close(source);
  369.         end;
  370.     end;
  371.     if not length(filename)=0 then writeln('Dane zapisano w pliku ',filename,'.');
  372.     writeln('Nacisnij dowolny klawisz...');
  373.     repeat until KeyPressed;
  374. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement