Einzelnen Beitrag anzeigen

gwxxl

Registriert seit: 23. Apr 2004
Ort: Berlin
19 Beiträge
 
#4

Re: Galeriebastler mit Thumbmaker, effektivität des Programm

  Alt 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
Miniaturansicht angehängter Grafiken
vorschau.png  
Angehängte Dateien
Dateityp: rar galeriebastler_v0.2.rar (253,0 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat