![]() |
Galeriebastler mit Thumbmaker, effektivität des Programms?
Liste der Anhänge anzeigen (Anzahl: 2)
Hi Leute,
ich bin gerade aktiv am Delphilernen und mache mir deswegen ein Programm, mit dem Thumbs und eine Galerie erstellen kann. Den Teil für die Thumbnailerstellung hab ich jetzt fertig und wollte mal fragen, was ihr davon so haltet.
Delphi-Quellcode:
das Programm (unfertig, Galerien können noch nicht erstellt werden) ist im Anhang.
function substr(str:string; a,e:integer):string;
var iFor:integer; begin result:=''; for iFor:=a to e do result:=result+str[iFor]; end; 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 Timport.Fertigstellen; var iFor, Breite, Hoehe : integer; counterstr, name : string; images : TBilder; AktuellesBild, AngepasstesBild : TBitmap32; jpg : TJPEGImage; bmp : TBitmap; begin if eigenschaften.fu_thumbserstellen.Checked then begin setlength(images, 0); // Verzeichnis erstellen, falls nicht existiert if not DirectoryExists(ausgabeseite.fu_hauptpfad.Text) then ForceDirectories(ausgabeseite.fu_hauptpfad.Text); for iFor:=0 to fu_BilderBox.Count-1 do if FileExists( import.fu_BilderBox.Items.Strings[iFor] ) then begin try setlength(images, iFor+1); AktuellesBild:=TBitmap32.Create; AngepasstesBild:=TBitmap32.Create; AktuellesBild.StretchFilter:=sfLanczos; AktuellesBild.LoadFromFile(import.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; // Bild verkleinern GetNewSize(AktuellesBild, eigenschaften.fu_tbreite.Value, eigenschaften.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(eigenschaften.fu_tdateiname.Text, counterstr, substr(ExtractFileName(import.fu_BilderBox.Items.Strings[iFor]),1,length(ExtractFileName(import.fu_BilderBox.Items.Strings[iFor]))-4)); jpg.SaveToFile(ausgabeseite.fu_hauptpfad.Text+name+'.jpg'); images[iFor].mini:=name+'.jpg'; // Originalbild an neue Größe anpassen if ( eigenschaften.fu_groesseaendern.Checked ) and ( ( AktuellesBild.Width >= eigenschaften.fu_obreite.Value ) or ( AktuellesBild.Height >= eigenschaften.fu_ohoehe.Value ) ) then begin GetNewSize(AktuellesBild, eigenschaften.fu_obreite.Value, eigenschaften.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(eigenschaften.fu_odateiname.Text, counterstr, substr(ExtractFileName(import.fu_BilderBox.Items.Strings[iFor]),1,length(ExtractFileName(import.fu_BilderBox.Items.Strings[iFor]))-4)); jpg.SaveToFile(ausgabeseite.fu_hauptpfad.Text+name+'.jpg'); images[iFor].orig:=name+'.jpg'; finally AktuellesBild.Free; AngepasstesBild.Free; jpg.Free; bmp.Free; end; end; // For + IF Bild existiert end; // IF Thumbs erstellen end; Dass die Elemente noch ein wenig seltsam Angeordnet sind, werde ich später noch verändern. Versucht einfach damit klar zu kommen. Es soll wie ein WinDialog aussehen. Jede Seite hat dabei ein eigenes Forumlar, später will ich alle Elemente jedoch auf ein Formular platzieren und ein und ausblenden. Achso, ich nutze die Graphics32-Lib! ( ![]() mfg gwxxl |
Re: Galeriebastler mit Thumbmaker, effektivität des Programm
hi,
ich find das program ganz gut (ist auch sehr nützlich, um digicam photos auf die homepage zu packen), hab aber einen fehler entdeckt: wenn man bilder speichert (ohne gallerie), dann wird das große bild genauso klein wie das kleine. :gruebel: cu nicnacman |
Re: Galeriebastler mit Thumbmaker, effektivität des Programm
Ich hab mir das Prog noch nicht angeschaut, wollte aber zum Code was loswerden.
Ich wollte in mir tatsächlich durchlesen, aber dein Formatierungsstil ist echt grausam. Tust du dir selbst nicht schwer, wenn du deinen eigenen Code liest? Zur ersten Funktion hab ich trotzdem einen alternativen Vorschlag:
Delphi-Quellcode:
Wobei du dir damit die Funktion SubStr wieder sparen könntest und direkt das Copy aufrufen.
function SubStr(const str:string; a, e:integer): string;
begin result := Copy(str, a, e - a); end; grüße, daniel |
Re: Galeriebastler mit Thumbmaker, effektivität des Programm
Liste der Anhänge anzeigen (Anzahl: 2)
[ie abgestürzt alles nochma schreiben :lol: ]
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. :P 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:
Momentan sind noch folgende Probleme: Für jedes Bild wird der Dateiname extra nach [index] und [name] durchsucht, dass müsste ich noch verbessern.
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; 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! :-P 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 |
Re: Galeriebastler mit Thumbmaker, effektivität des Programm
hi,
wenn ich "galerie erstellen" nicht auswähle, dann ist der weiter button auf der zweiten seite deaktiviert. wenn ich "galerie erstellen" auswähle, dann ist er zwar aktiviert, es passiert aber nichts. das mit dem anhaltebutton kannst du lösen, indem du eine neue variable "anhalten" (boolean) deklarierst, und ihr den wert "true" gibst, wenn man den anhaltebutton drückt. dann nur noch die schleife ein bisschen erweitern, und fertig.
Delphi-Quellcode:
...
anhalten := False; for iFor := 0 to fu_BilderBox.Count-1 do begin if anhalten then break; if FileExists(import.fu_BilderBox.Items.Strings[iFor]) then begin ... end; end; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz