123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2003 by the Free Pascal development team
- Image conversion example.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$mode objfpc}{$h+}
- program ImgConv;
- {_$define UseFile}
- uses FPWriteXPM, FPWritePNG, FPWriteBMP,fpreadgif,
- FPReadXPM, FPReadPNG, FPReadBMP, fpreadjpeg,fpwritejpeg,
- fpreadtga,fpwritetga,fpreadpnm,fpwritepnm, fpreadtiff, fpwritetiff,
- {$ifndef UseFile}classes,{$endif}
- FPImage, sysutils;
- var img : TFPMemoryImage;
- reader : TFPCustomImageReader;
- Writer : TFPCustomimageWriter;
- ReadFile, WriteFile, WriteOptions : string;
- procedure Init;
- var t : char;
- begin
- if paramcount = 4 then
- begin
- T := upcase (paramstr(1)[1]);
- if T = 'X' then
- Reader := TFPReaderXPM.Create
- else if T = 'B' then
- Reader := TFPReaderBMP.Create
- else if T = 'J' then
- Reader := TFPReaderJPEG.Create
- else if T = 'G' then
- Reader := TFPReaderGif.Create
- else if T = 'P' then
- Reader := TFPReaderPNG.Create
- else if T = 'T' then
- Reader := TFPReaderTarga.Create
- else if T = 'F' then
- Reader := TFPReaderTiff.Create
- else if T = 'N' then
- Reader := TFPReaderPNM.Create
- else
- begin
- Writeln('Unknown file format : ',T);
- Halt(1);
- end;
- ReadFile := paramstr(2);
- WriteOptions := paramstr(3);
- WriteFile := paramstr(4);
- end
- else
- begin
- Reader := nil;
- ReadFile := paramstr(1);
- WriteOptions := paramstr(2);
- WriteFile := paramstr(3);
- end;
- WriteOptions := uppercase (writeoptions);
- T := WriteOptions[1];
- if T = 'X' then
- Writer := TFPWriterXPM.Create
- else if T = 'B' then
- begin
- Writer := TFPWriterBMP.Create;
- TFPWriterBMP(Writer).BitsPerPixel:=32;
- end
- else if T = 'J' then
- Writer := TFPWriterJPEG.Create
- else if T = 'P' then
- Writer := TFPWriterPNG.Create
- else if T = 'T' then
- Writer := TFPWriterTARGA.Create
- else if T = 'F' then
- Writer := TFPWriterTiff.Create
- else if T = 'N' then
- Writer := TFPWriterPNM.Create
- else
- begin
- Writeln('Unknown file format : ',T);
- Halt(1);
- end;
- img := TFPMemoryImage.Create(0,0);
- img.UsePalette:=false;
- end;
- procedure ReadImage;
- {$ifndef UseFile}var str : TStream;{$endif}
- begin
- if assigned (reader) then
- img.LoadFromFile (ReadFile, Reader)
- else
- {$ifdef UseFile}
- img.LoadFromFile (ReadFile);
- {$else}
- if fileexists (ReadFile) then
- begin
- str := TFileStream.create (ReadFile,fmOpenRead);
- try
- img.loadFromStream (str);
- finally
- str.Free;
- end;
- end
- else
- writeln ('File ',readfile,' doesn''t exists!');
- {$endif}
- end;
- procedure WriteImage;
- var t : string;
- begin
- t := WriteOptions;
- writeln (' WriteImage, options=',t);
- if (t[1] = 'P') then
- with (Writer as TFPWriterPNG) do
- begin
- Grayscale := pos ('G', t) > 0;
- Indexed := pos ('I', t) > 0;
- WordSized := pos('W', t) > 0;
- UseAlpha := pos ('A', t) > 0;
- writeln ('Grayscale ',Grayscale, ' - Indexed ',Indexed,
- ' - WordSized ',WordSized,' - UseAlpha ',UseAlpha);
- end
- else if (t[1] = 'X') then
- begin
- if length(t) > 1 then
- with (Writer as TFPWriterXPM) do
- begin
- ColorCharSize := ord(t[2]) - ord('0');
- end;
- end;
- writeln ('Options checked, now writing...');
- img.SaveToFile (WriteFile, Writer);
- end;
- procedure Clean;
- begin
- Reader.Free;
- Writer.Free;
- Img.Free;
- end;
- begin
- if (paramcount <> 4) and (paramcount <> 3) then
- begin
- writeln ('Give filename to read and to write, preceded by filetype:');
- writeln ('X for XPM, P for PNG, B for BMP, J for JPEG, T for TGA,');
- writeln ('N for PNM (read only), F for TIFF, G for gif (read only)');
- writeln ('example: imgconv X hello.xpm P hello.png');
- writeln ('example: imgconv hello.xpm P hello.png');
- writeln ('Options for');
- writeln (' PNG : G : grayscale, A : use alpha, ');
- writeln (' I : Indexed in palette, W : Word sized.');
- writeln (' XPM : Number of chars to use for 1 pixel');
- writeln (' The color size of an XPM can be set after the X as 1,2,3 or 4');
- writeln ('example: imgconv hello.xpm PIA hello.png');
- writeln ('example: imgconv hello.png X2 hello.xpm');
- end
- else
- try
- writeln ('Initing');
- Init;
- writeln ('Reading image');
- ReadImage;
- writeln ('Writing image');
- WriteImage;
- writeln ('Clean up');
- Clean;
- except
- on e : exception do
- writeln ('Error: ',e.message);
- end;
- end.
|