Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {------------------------------}
- { Wojciech Gancarz }
- { Informatyka, Rok I }
- { Grupa IV }
- { }
- { Konwerter RGB/HSV/YUV }
- {------------------------------}
- {-------------------------------------------------------------------------------------------------------}
- { Program pobiera z pliku skladowe koloru w 1 z 3 modeli barw (RGB,HSV,YUV), wylicza skladowe }
- { pozostalych 2 modeli dla tego koloru i zapisuje do innego pliku. }
- { }
- { Dla RGB: wszystkie skladowe musza byc calkowite i nalezec do <0,255>' }
- { Dla YUV: Y musi byc calkowite i nalezec do <0,255>. U,V musza byc calkowite i nalezec do <-127,128>.' }
- { Dla HSV: H musi nalezec do <0,360). S,V musza nalezec do <0,1>. }
- { }
- { Skladowe w pliku musza byc poprzedzone nazwa modelu i dwukropkiem, rozdzielone przecinkiem }
- { i zakonczone srednikiem. Przyklad tresci pliku: }
- { }
- { RGB:45,99,114; }
- { YUV:218,-125,3; }
- { rgb:200,100,114; }
- { hsv:312,0.81,0.9114; }
- {-------------------------------------------------------------------------------------------------------}
- program colorconvert2;
- uses crt, sysutils, math;
- type
- arrayint = array[1..3] of integer;
- arrayext = array[1..3] of extended;
- var
- source,output:text; {source - plik wejsciowy; output - plik wyjsciowy}
- filename:string; {nazwa pliku}
- input:string; {linia tekst w pliku wejsciowym}
- dataexists:boolean; {informuje czy poprawne dane zostaly znalezione}
- nopoint:boolean; {informuje czy w liczbie skladowej wystapil juz przecinek}
- i,j,k:integer; {do inkrementacji}
- current: array[1..3] of string; {tablica 3 stringow ze skladowymi koloru}
- rgb: arrayint; {tablica skladowych rgb}
- hsv: arrayext; {tablica skladowych hsv}
- yuv: arrayint; {tablica skladowych yuv}
- function FileNameCorrect(s:string):boolean; {sprawdza poprawnosc nazwy pliku}
- var
- t:string;
- LegalCharacterExists:boolean;
- begin
- FileNameCorrect:=true;
- LegalCharacterExists:=false;
- if length(s)=0 then FileNameCorrect:=false;
- for i:=1 to length(s) do
- begin
- 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
- else if ((s[i]=' ') and (i=length(s)) and (LegalCharacterExists=false)) then begin FileNameCorrect:=false; break; end
- else if ((s[i]=' ') and (i<>length(s))) then
- begin
- t:=s;
- delete(t,1,i);
- FileNameCorrect:=FileNameCorrect(t);
- end
- else LegalCharacterExists:=true;
- end;
- end;
- function min(x,y:extended):extended; {znajduje minimum}
- begin
- if x<=y then min:=x
- else min:=y
- end;
- function max(x,y:extended):extended; {znajduje maksimum}
- begin
- if x>=y then max:=x
- else max:=y
- end;
- 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)}
- var {funkcja zwraca tablice trzyelementowa (extended) skladajaca sie z 3 skladowych HSV (hsv[1]=H, hsv[2]=S, hsv[3]=V)}
- datacorrect:boolean; {gdy dane RGB sa bledne, funkcja zwraca H=-1, S=0, V=0}
- rgb_min,rgb_max:extended;
- r,g,b,h,s,v:extended;
- begin
- r:=rgb[1];
- g:=rgb[2];
- b:=rgb[3];
- datacorrect:=true;
- if ((r<0) OR (r>255)) then datacorrect:=false {sprawdza poprawnosc skladowej R}
- else if ((g<0) OR (g>255)) then datacorrect:=false {sprawdza poprawnosc skladowej G}
- else if ((b<0) OR (b>255)) then datacorrect:=false; {sprawdza poprawnosc skladowej B}
- if datacorrect=true then begin
- rgb_min:=min(min(r,g),b);
- rgb_max:=max(max(r,g),b);
- v:=rgb_max;
- if v=0 then begin h:=0; s:=0; end
- else begin
- r:=r/255;
- g:=g/255;
- b:=b/255;
- rgb_min:=min(min(r,g),b);
- rgb_max:=max(max(r,g),b);
- v:=rgb_max;
- if v=0 then begin h:=0; s:=0; end
- else begin
- r:=(r/v);
- g:=(g/v);
- b:=(b/v);
- rgb_min:=min(min(r,g),b);
- rgb_max:=max(max(r,g),b);
- s:=rgb_max-rgb_min;
- if s=0 then h:=0
- else begin
- r:=(r-rgb_min)/(rgb_max-rgb_min);
- g:=(g-rgb_min)/(rgb_max-rgb_min);
- b:=(b-rgb_min)/(rgb_max-rgb_min);
- rgb_min:=min(min(r,g),b);
- rgb_max:=max(max(r,g),b);
- if rgb_max=r then begin
- h:=60*(g-b);
- if h<0 then h:=(h-360);
- end
- else if rgb_max=g then h:=(120+60*(b-r))
- else h:=(240+60*(r-g));
- end;
- end;
- end;
- end
- else {datacorrect=false} begin
- h:=-1; {blad:bledne dane wejsciowe}
- s:=0;
- v:=0;
- end;
- RGBtoHSV[1]:=h;
- RGBtoHSV[2]:=s;
- RGBtoHSV[3]:=v;
- end;
- 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)}
- var {funkcja zwraca tablice trzyelementowa (integer) skladajaca sie z 3 skladowych YUV (yuv[1]=Y, yuv[2]=S, yuv[3]=V)}
- r,g,b,y,u,v:extended; {gdy dane RGB sa bledne, funkcja zwraca Y=-1, U=0, V=0}
- datacorrect:boolean;
- begin
- r:=rgb[1];
- g:=rgb[2];
- b:=rgb[3];
- datacorrect:=true;
- if ((r<0) OR (r>255)) then datacorrect:=false {sprawdza poprawnosc skladowej R}
- else if ((g<0) OR (g>255)) then datacorrect:=false {sprawdza poprawnosc skladowej G}
- else if ((b<0) OR (b>255)) then datacorrect:=false; {sprawdza poprawnosc skladowej B}
- if datacorrect=true then begin
- y:=(0.299*r+0.587*g+0.114*b);
- u:=(b-y);
- v:=(r-y);
- end
- else {datacorrect=false} begin
- y:=-1; {blad:bledne dane wejsciowe}
- u:=0;
- v:=0;
- end;
- RGBtoYUV[1]:=Round(y);
- RGBtoYUV[2]:=Round(u);
- RGBtoYUV[3]:=Round(v);
- end;
- 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)}
- var {funkcja zwraca tablice trzyelementowa (integer) skladajaca sie z 3 skladowych RGB (rgb[1]=R, rgb[2]=G, rgb[3]=B)}
- datacorrect:boolean; {gdy dane HSV sa bledne, funkcja zwraca R=-1, G=0, B=0}
- h,s,v,r,g,b,i,f,p,q,t:extended;
- begin
- h:=hsv[1];
- s:=hsv[2];
- v:=hsv[3];
- datacorrect:=true;
- if ((h<0) OR (h>=360)) then datacorrect:=false {weryfikacja poprawnosci H}
- else if ((s<0) OR (s>1)) then datacorrect:=false {weryfikacja poprawnosci S}
- else if ((v<0) OR (v>1)) then datacorrect:=false; {weryfikacja poprawnosci V}
- if datacorrect=true then begin
- if v=0 then begin r:=0; g:=0; b:=0; end
- else begin
- h := h/60;
- i := Floor(h);
- f := h-i;
- p := v*(1-s);
- q := v*(1-(s*f));
- t := v*(1-(s*(1-f)));
- if i=0 then begin r:=v; g:=t; b:=p; end
- else if i=1 then begin r:=q; g:=v; b:=p; end
- else if i=2 then begin r:=p; g:=v; b:=t; end
- else if i=3 then begin r:=p; g:=q; b:=v; end
- else if i=4 then begin r:=t; g:=p; b:=v; end
- else if i=5 then begin r:=v; g:=p; b:=q; end;
- end;
- r:=(r*255);
- g:=(g*255);
- b:=(b*255);
- end
- else {datacorrect=false} begin
- r:=-1; {blad:bledne dane wejsciowe}
- g:=0;
- b:=0;
- end;
- HSVtoRGB[1]:=Round(r);
- HSVtoRGB[2]:=Round(g);
- HSVtoRGB[3]:=Round(b);
- end;
- 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)}
- var {funkcja zwraca tablice trzyelementowa (integer) skladajaca sie z 3 skladowych RGB (rgb[1]=R, rgb[2]=G, rgb[3]=B)}
- datacorrect:boolean; {gdy dane HSV sa bledne, funkcja zwraca R=-1, G=0, B=0}
- y,u,v,r,g,b:extended;
- begin
- y:=yuv[1];
- u:=yuv[2];
- v:=yuv[3];
- datacorrect:=true;
- if ((y<0) OR (y>255)) then datacorrect:=false {sprawdzenie poprawnosci Y}
- else if ((u<-128) OR (u>127)) then datacorrect:=false {sprawdzenie poprawnosci U}
- else if ((v<-128) OR (v>127)) then datacorrect:=false; {sprawdzenie poprawnosci V}
- if datacorrect=true then begin
- b:=u+y;
- r:=v+y;
- g:=((y-(0.299*r)-(0.114*b))/0.587);
- r:=Round(r);
- g:=Round(g);
- b:=Round(b);
- end
- else begin
- r:=-1;
- g:=0;
- b:=0;
- end;
- YUVtoRGB[1]:=Round(r);
- YUVtoRGB[2]:=Round(g);
- YUVtoRGB[3]:=Round(b);
- end;
- begin
- clrscr;
- DecimalSeparator:='.'; {oznaczenie przecinka w stringach dla StrToFloat}
- writeln('Podaj nazwe pliku ze skladowymi kolorow. Skladowe musza byc sformatowane nastepujaco: "RGB:R,G,B;" i podobnie dla YUV oraz HSV.');
- writeln('Dla RGB: wszystkie skladowe musza byc calkowite i nalezec do <0,255>');
- writeln('Dla YUV: Y musi byc calkowite i nalezec do <0,255>. U,V musza byc calkowite i nalezec do <-127,128>.');
- writeln('Dla HSV: H musi nalezec do <0,360). S,V musza nalezec do <0,1>.');
- readln(filename);
- if fileexists(filename)=false then writeln('Nie znaleziono pliku.')
- else begin
- if FileNameCorrect(filename)=false then writeln('Niepoprawna nazwa pliku.')
- else begin
- assign(source,filename); {plik wejsciowy}
- reset(source);
- writeln('Podaj nazwe pliku dla wynikow. Pozostaw puste pole, jezeli chcesz wypisac wyniki w konsoli.');
- readln(filename); {plik wyjsciowy}
- if FileNameCorrect(filename)=false then writeln('Niepoprawna nazwa pliku.')
- else begin
- assign(output,filename);
- rewrite(output);
- dataexists:=false; {na poczatku nie znaleziono zadnych skladowych}
- while not eof(source) do {czytanie danych pliku wejsciowego}
- begin
- readln(source,input);
- for i:=1 to (length(input)-3) do
- begin {czesc znajdujaca skladowe RGB i wyliczajaca HSV oraz YUV}
- 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:'}
- begin
- for k:=1 to 3 do current[k]:='0'; {zeruje 3 elementy tablicy}
- k:=1;
- for j:=i+4 to (length(input)) do
- begin
- if ((input[j] >= '0') AND (input[j] <= '9')) then current[k]:=current[k]+input[j] {dodaje do stringa kolejne cyfry}
- else if ((input[j] = ',') AND (k>=1) AND (k<=2)) then {szuka przecinkow miedzy skladowymi, gdy wpisano mniej niz 2 skladowe}
- begin
- rgb[k]:=StrToInt(current[k]); {zamienia string na integer i umieszcza w tablicy integerow}
- k:=k+1;
- end
- else if ((input[j] = ';') AND (k=3)) then {wyszukuje srednika, ktory zamyka skladowe}
- begin
- rgb[k]:=StrToInt(current[k]); {zamienia string na integer i umieszcza w tablicy integerow}
- hsv:=RGBtoHSV(rgb); {wywoluje zamiane RGB na HSV}
- if (hsv[1]<>(-1)) then begin {jezeli dane sa poprawne}
- yuv:=RGBtoYUV(rgb); {wywoluje zamiane RGB na YUV}
- writeln(output,'RGB:',rgb[1],',',rgb[2],',',rgb[3],';'); {wypisuje dane}
- writeln(output,'HSV:',hsv[1]:1:0,',',hsv[2]:1:3,', ',hsv[3]:1:3,';');
- writeln(output,'YUV:',yuv[1],',',yuv[2],',',yuv[3],';');
- writeln(output);
- dataexists:=true; {znaleziono prawidlowe dane}
- end;
- end
- else break; {gdy ktorys ze znakow jest niewlasciwy dla poprawnosci skladowych, przerywa petle i szuka kolejnych zestawow}
- end
- end
- {pozostale 2 czesci (HSV i YUV) dzialaja analogicznie do czesci wyszukujacej RGB}
- {czesc znajdujaca skladowe HSV i wyliczajaca RGB oraz YUV}
- 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
- begin
- for k:=1 to 3 do current[k]:='0';
- k:=1;
- nopoint:=true; {nie znaleziono przecinka w liczbie}
- for j:=i+4 to (length(input)) do
- begin
- if ((input[j] >= '0') AND (input[j] <= '9')) then current[k]:=current[k]+input[j]
- else if ((input[j] = '.') AND nopoint=true) then
- begin
- current[k]:=current[k]+input[j]; {znaleziono i dopisano kropke}
- nopoint:=false; {znaleziono kropke, kolejne nie moga wystapic}
- end
- else if ((input[j] = ',') AND (k>=1) AND (k<=2)) then
- begin
- hsv[k]:=StrToFloat(current[k]);
- k:=k+1;
- nopoint:=true;
- end
- else if ((input[j] = ';') AND (k=3)) then {zakonczono 3 skladowe}
- begin
- hsv[k]:=StrToFloat(current[k]);
- rgb:=HSVtoRGB(hsv);
- if (rgb[1]<>(-1)) then begin
- yuv:=RGBtoYUV(rgb);
- writeln(output,'HSV:',hsv[1]:1:0,',',hsv[2]:1:3,',',hsv[3]:1:3,';');
- writeln(output,'RGB:',rgb[1],',',rgb[2],',',rgb[3],';');
- writeln(output,'YUV:',yuv[1],',',yuv[2],',',yuv[3],';');
- writeln(output);
- dataexists:=true;
- end;
- end
- else break;
- end;
- end
- {czesc znajdujaca skladowe YUV i wyliczajaca RGB oraz HSV}
- 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
- begin
- for k:=1 to 3 do current[k]:='0';
- k:=1;
- nopoint:=true;
- for j:=i+4 to (length(input)) do
- begin
- if ((input[j]='-') AND ((input[j-1]=',') OR (input[j-1]=':'))) then current[k]:='-'
- else if ((input[j] >= '0') AND (input[j] <= '9')) then current[k]:=current[k]+input[j]
- else if ((input[j] = ',') AND (k>=1) AND (k<=2)) then
- begin
- yuv[k]:=StrToInt(current[k]);
- k:=k+1;
- nopoint:=true;
- end
- else if ((input[j] = ';') AND (k=3)) then
- begin
- yuv[k]:=StrToInt(current[k]);
- rgb:=YUVtoRGB(yuv);
- if (rgb[1]<>(-1)) then begin
- hsv:=RGBtoHSV(rgb);
- writeln(output,'YUV:',yuv[1],',',yuv[2],',',yuv[3],';');
- writeln(output,'RGB:',rgb[1],',',rgb[2],',',rgb[3],';');
- writeln(output,'HSV:',hsv[1]:1:0,',',hsv[2]:1:3,',',hsv[3]:1:3,';');
- writeln(output);
- dataexists:=true;
- end;
- end
- else break;
- end;
- end;
- end;
- end;
- close(output);
- if dataexists=false then writeln('Nie znaleziono danych.'); {nie wyliczono zadnych danych}
- end;
- close(source);
- end;
- end;
- if not length(filename)=0 then writeln('Dane zapisano w pliku ',filename,'.');
- writeln('Nacisnij dowolny klawisz...');
- repeat until KeyPressed;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement