Chciałbym jeszcze pociągnąć temat, chociaż już sprawa tyczy się tylko zmniejszenia rozmiaru aplikacji. Z UPX korzystać umiem, jednak wydaje mi się, że coś tu się jeszcze da zrobić. Oto dwa kody:
Pierwszy, utworzony jako aplikacja konsolowa:
program Resizer;
uses
JPEG, Graphics, Types;
var
JPG : TJPEGImage;
BMP : TBitmap;
NewHeight, NewWidth : Integer;
OldName, NewName:string;
i :integer;
begin
{ TODO -oUser -cConsole Main : Insert code here }
if (ParamCount<1) then halt;
JPG := TJPEGImage.Create;
BMP := TBitmap.Create;
for i:=1 to ParamCount do begin
try
OldName:=ParamStr(i);
if ((ExtractFileExt(OldName)<>'.jpg') and (ExtractFileExt(OldName)<>'.jpeg')) then continue;
JPG.LoadFromFile(OldName);
NewName:=ExtractFilePath(ParamStr(i))+'sm_'+ExtractFileName(ParamStr(i));
BMP.Assign(JPG);
NewHeight := BMP.Height div 3; //tu ustawiamy jaką wielkośc ma mieć pomniejszony obrazek
NewWidth := BMP.Width div 3;
BMP.Canvas.StretchDraw(Rect(0, 0, NewWidth, NewHeight), BMP);
BMP.Width := NewWidth;
BMP.Height := NewHeight;
JPG.Assign(BMP);
JPG.SaveToFile(NewName);
except
end;
end;
BMP.Free;
JPG.Free;
end.
Pozbyłem się nim wszystkich packages (w opcjach projektu), kilku elementów uses oraz dyrektywy(?) na początku pliku "{$APPTYPE CONSOLE}", która zablokowała wyświetlanie denerwującego mnie okienka.
Rozmiar aplikacji 234kB.
Drugi kod, pierwotny, pisany jako zwykłą aplikacja, w której schowałem formatkę:
program resizer;
uses
Forms, Unit1 in 'Unit1.pas';
{$R *.res}
begin
Application.Initialize;
Application.Title := 'Beton''s Resizer';
Application.Run;
end.
i kod unit1:
unit Unit1;
interface
uses SysUtils, Classes, Graphics, Forms, JPEG;
implementation
procedure Zmniejsz;
var
JPG : TJPEGImage;
BMP : TBitmap;
NewHeight, NewWidth : Integer;
OldName, NewName:string;
i :integer;
begin
// sprawdź, czy podano parametry
if (ParamCount<1) then Application.Terminate;
JPG := TJPEGImage.Create;
BMP := TBitmap.Create;
for i:=1 to ParamCount do begin
try
OldName:=ParamStr(i);
// sprawdź, czy ma rozszerzenie jpg lub jpeg
if ((ExtractFileExt(OldName)<>'.jpg') and (ExtractFileExt(OldName)<>'.jpeg')) then continue;
NewName:=ExtractFilePath(ParamStr(i))+'sm_'+ExtractFileName(ParamStr(i));
JPG.LoadFromFile(OldName);
BMP.Assign(JPG);
//tu ustawiamy jaką wielkośc ma mieć pomniejszony obrazek
NewHeight := BMP.Height div 3;
NewWidth := BMP.Width div 3;
BMP.Canvas.StretchDraw(Rect(0, 0, NewWidth, NewHeight), BMP);
BMP.Width := NewWidth;
BMP.Height := NewHeight;
JPG.Assign(BMP);
JPG.SaveToFile(NewName);
except
end;
end;
BMP.Free;
JPG.Free;
Application.Terminate;
end;
begin
Zmniejsz;
end.
I w tym programie również pozbyłem się elementów uses, pliku *.dfm oraz packages. Formatka się nie wyświetla, bo zablokowałem jej tworzenie.
Program ten jednak po skompilowaniu ma 437kB.
I jedyne, co wiem, ze mogę zrobić w drugim przypadku, to usunięcie resources (tak jak w artykule "Mały EXE").
Ciągle jednak podejrzewam, że robię to źle i kompilator za dużo dodaje do mojego programu. Na forum i w artykułach nie mogę znaleźć już nic na ten temat.
Kompresję UPX-em chcę stosować dopiero po wyczerpaniu wszystkich możliwości, a ta w tym przypadku daje zysk 50%, chociaż zwalnia działanie programu.