AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Galeriebastler mit Thumbmaker, effektivität des Programms?
Thema durchsuchen
Ansicht
Themen-Optionen

Galeriebastler mit Thumbmaker, effektivität des Programms?

Ein Thema von gwxxl · begonnen am 7. Jun 2004 · letzter Beitrag vom 10. Jun 2004
Antwort Antwort
gwxxl

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

Galeriebastler mit Thumbmaker, effektivität des Programms?

  Alt 7. Jun 2004, 21:01
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:
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;
das Programm (unfertig, Galerien können noch nicht erstellt werden) ist im Anhang.

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! ( http://g32.org )

mfg gwxxl
Miniaturansicht angehängter Grafiken
programm.png  
Angehängte Dateien
Dateityp: rar galeriebastler.rar (239,9 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von NicNacMan
NicNacMan

Registriert seit: 28. Mai 2004
Ort: Hamburg
98 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Galeriebastler mit Thumbmaker, effektivität des Programm

  Alt 8. Jun 2004, 21:41
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.

cu nicnacman
The Double-Crunch-Peanuts!
SwapIt:
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: Galeriebastler mit Thumbmaker, effektivität des Programm

  Alt 8. Jun 2004, 22:03
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:
function SubStr(const str:string; a, e:integer): string;
begin
  result := Copy(str, a, e - a);
end;
Wobei du dir damit die Funktion SubStr wieder sparen könntest und direkt das Copy aufrufen.

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
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
Benutzerbild von NicNacMan
NicNacMan

Registriert seit: 28. Mai 2004
Ort: Hamburg
98 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Galeriebastler mit Thumbmaker, effektivität des Programm

  Alt 10. Jun 2004, 16:07
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;
...
The Double-Crunch-Peanuts!
SwapIt:
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz