mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 09:59:40 +02:00
176 lines
4.5 KiB
ObjectPascal
176 lines
4.5 KiB
ObjectPascal
{
|
|
$Id$
|
|
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,
|
|
FPReadXPM, FPReadPNG, FPReadBMP, fpreadjpeg,fpwritejpeg,
|
|
fpreadtga,fpwritetga,fpreadpnm,
|
|
{$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 = 'P' then
|
|
Reader := TFPReaderPNG.Create
|
|
else if T = 'T' then
|
|
Reader := TFPReaderTarga.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).BytesPerPixel:=4;
|
|
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
|
|
begin
|
|
Writeln('Unknown file format : ',T);
|
|
Halt(1);
|
|
end;
|
|
img := TFPMemoryImage.Create(0,0);
|
|
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 (write only), J for JPEG');
|
|
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 ('Writeing image');
|
|
WriteImage;
|
|
writeln ('Clean up');
|
|
Clean;
|
|
except
|
|
on e : exception do
|
|
writeln ('Error: ',e.message);
|
|
end;
|
|
end.
|