Registriert seit: 23. Apr 2004
Ort: Berlin
19 Beiträge
|
Re: Galeriebastler mit Thumbmaker, effektivität des Programm
10. Jun 2004, 10:01
[ie abgestürzt alles nochma schreiben ]
Hi,
danke für die Kritik erstmal, die Funktion copy hatte ich irgendwo mal gesehen, dann doch nicht mehr gefunden. Nu hab ich sie dank dir endlich.
Das mit dem Programmierstil hab ich mir vor nen paar Wochen mal durchgelesen und finde, dass ich es schon recht gut mache. Sollte dir der Quelltext so extrem zu wider sein, dann kannst du ja mal ein paar Zeilen rauspicken und dich daran auslassen.
Hab das Programm jetzt völlig neu gemacht, sprich neue Oberfläche, annähernd gleicher Quelltext. Jetzt ist auch ne Progressbar mit drin, nur Funktioniert der Abbrechen-Button (der das Programm beendet) noch nicht wirklich, ich werd mir dazu nochma nen paar Themen durchlesen.
@NicNacMan: Der Fehler sollte jetzt nicht mehr auftreten, wenn doch, dann sag bitte bescheid.
Delphi-Quellcode:
function ExtractDateiName(dateiname, counterstr, name:string):string;
var iFor:integer;
begin
result:=''; iFor:=1;
while iFor <= length(dateiname) do begin
if dateiname[iFor] = '[' then begin
if substr(dateiname, iFor, iFor+6) = '[index]' then begin
result:=result+counterstr; iFor:=iFor+6; end
else if substr(dateiname, iFor, iFor+5) = '[name]' then begin
result:=result+name; iFor:=iFor+5; end
else result:=result+dateiname[iFor];
end else result:=result+dateiname[iFor];
iFor:=iFor+1;
end; // while
end;
procedure GetNewSize(Bitmap : TBitmap32; MaxWidth, MaxHeight : integer; var NewWidth, NewHeight : integer);
begin
if Bitmap.Width > Bitmap.Height then begin
NewWidth:=MaxWidth;
NewHeight:=round(NewWidth / (Bitmap.Width / Bitmap.Height));
if NewHeight > MaxHeight then begin
NewHeight:=MaxHeight;
NewWidth:=round(Bitmap.Width / Bitmap.Height * NewHeight);
end;
end else begin
NewHeight:=MaxHeight;
NewWidth:=round(Bitmap.Width / Bitmap.Height * NewHeight);
if NewWidth > MaxWidth then begin
NewWidth:=MaxWidth;
NewHeight:=round(NewWidth / (Bitmap.Width / Bitmap.Height));
end;
end;
end;
procedure TGaleriebastler.st_fertigClick(Sender: TObject);
var
iFor, Breite, Hoehe : integer;
counterstr, name : string;
images : TBilder;
AktuellesBild, AngepasstesBild : TBitmap32;
jpg : TJPEGImage;
bmp : TBitmap;
begin
AktiviereSeite(9);
Application.ProcessMessages;
if seite1_fu_minibildererstellen.Checked then begin
setlength(images, 0);
// Verzeichnise erstellen, falls nicht existent
if not DirectoryExists(seite1_fu_hauptpfad.Text) then ForceDirectories(seite1_fu_hauptpfad.Text);
if not DirectoryExists(seite1_fu_hauptpfad.Text+'\'+seite2_fu_mini.Text) then ForceDirectories(seite1_fu_hauptpfad.Text+'\'+seite2_fu_mini.Text);
if not DirectoryExists(seite1_fu_hauptpfad.Text+'\'+seite2_fu_orig.Text) then ForceDirectories(seite1_fu_hauptpfad.Text+'\'+seite2_fu_orig.Text);
seite9_fu_bilder.Max := seite1_fu_BilderBox.Count;
for iFor:=0 to seite1_fu_BilderBox.Count-1 do if FileExists( seite1_fu_BilderBox.Items.Strings[iFor] ) then begin
try
setlength(images, iFor+1);
AktuellesBild:=TBitmap32.Create;
AngepasstesBild:=TBitmap32.Create;
AktuellesBild.LoadFromFile(seite1_fu_BilderBox.Items.Strings[iFor]);
counterstr:=inttostr(iFor);
if iFor<100 then counterstr:='0'+counterstr;
if iFor<10 then counterstr:='0'+counterstr;
jpg := TJPEGImage.Create;
bmp := TBitmap.Create;
if seite2_fu_detailstufe.ItemIndex = 0 then
AktuellesBild.StretchFilter:=sfLanczos
else
AktuellesBild.StretchFilter:=sfNearest;
// Bild verkleinern
GetNewSize(AktuellesBild, seite2_fu_tbreite.Value, seite2_fu_thoehe.Value, Breite, Hoehe);
AngepasstesBild.setSize(Breite, Hoehe);
AngepasstesBild.Draw(rect(0,0,Breite,Hoehe), Rect(0,0,AktuellesBild.Width, AktuellesBild.Height), AktuellesBild);
// Minibild
bmp.Assign(AngepasstesBild);
jpg.Assign(bmp);
name:=ExtractDateiName(seite2_fu_tdateiname.Text, counterstr, substr(ExtractFileName(seite1_fu_BilderBox.Items.Strings[iFor]),1,length(ExtractFileName(seite1_fu_BilderBox.Items.Strings[iFor]))-4));
jpg.SaveToFile(seite1_fu_hauptpfad.Text+'\'+seite2_fu_mini.Text+'\'+name+'.jpg');
images[iFor].mini:=name+'.jpg';
AktuellesBild.StretchFilter:=sfLanczos;
// Originalbild an neue Größe anpassen
if ( seite2_fu_groesseaendern.Checked ) and ( ( AktuellesBild.Width >= seite2_fu_obreite.Value ) or ( AktuellesBild.Height >= seite2_fu_ohoehe.Value ) ) then begin
GetNewSize(AktuellesBild, seite2_fu_obreite.Value, seite2_fu_ohoehe.Value, Breite, Hoehe);
AngepasstesBild.SetSize(Breite, Hoehe);
AngepasstesBild.Draw(rect(0,0,Breite,Hoehe), Rect(0,0,AktuellesBild.Width, AktuellesBild.Height), AktuellesBild);
AktuellesBild.Assign(AngepasstesBild);
end;
// Originalbild
bmp.Assign(AktuellesBild);
jpg.Assign(bmp);
name:=ExtractDateiName(seite2_fu_odateiname.Text, counterstr, substr(ExtractFileName(seite1_fu_BilderBox.Items.Strings[iFor]),1,length(ExtractFileName(seite1_fu_BilderBox.Items.Strings[iFor]))-4));
jpg.SaveToFile(seite1_fu_hauptpfad.Text+'\'+seite2_fu_orig.Text+'\'+name+'.jpg');
images[iFor].orig:=name+'.jpg';
seite9_fu_bilder.Position := iFor+1;
Application.ProcessMessages;
finally
AktuellesBild.Free;
AngepasstesBild.Free;
jpg.Free;
bmp.Free;
end;
end; // For + IF Bild existiert
end; // IF Thumbs erstellen
st_zurueck.Enabled := true;
st_fertig.Enabled := true;
end;
Momentan sind noch folgende Probleme: Für jedes Bild wird der Dateiname extra nach [index] und [name] durchsucht, dass müsste ich noch verbessern.
Außerdem fliegen beim Filter Bilddateien raus, bei denen JPG und BMP in großbuchtsaben geschrieben ist. Da muss ich bei der Überprüfung noch ne kleinigkeit ändern!
Galerien kann man wie gehabt noch nicht erstellen.
Letztlich ist das Programm bei JPG's noch recht langsam. Liegt das an der JPEG-Lib?
mfg
|