Programm zum Bilderverkleinern (brauche hilfe)

Dario Linsky

Erfahrenes Mitglied
klar. die eigenschaft "FileName" vom TFileListBox zeigt immer auf den dateinamen des ausgewählten listenelementes. also musst du erstmal eins aus der liste auswählen.
wobei das für deinen zweck nicht so geschickt ist, weil du so jedes bild selber auswählen müsstest. du kannst aber einfach ein verzeichnis angeben, aus dem du dir alle jpeg-dateien holst. ich bastel mal schnell einen code zusammen. :)
 

Friesi

Erfahrenes Mitglied
:) danke!
irgendwann lern ich das auch noch *gg*
gut das es so nette menschen gibt die einem dabei noch helfen :)
 

Dario Linsky

Erfahrenes Mitglied
Code:
uses (* ... *) FileCtrl;

(* ... *)

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: String;
  SRec: TSearchRec;
begin
  SelectDirectory('Verzeichnis auswählen...', 'Desktop', Dir);
  if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';

  if FindFirst(Dir, faAnyFile, SRec) = 0 then
  begin
    while FindNext(SRec) = 0 do
    begin
      if (SRec.Attr and faAnyFile) = SRec.Attr then
      begin
        if LowerCase(ExtractFileExt(SRec.Name)) = '.jpg' then
        begin
          Image1.Picture.LoadFromFile(SRec.Name);
          // Hier kommt noch der Code zum Bearbeiten des Bildes rein.
        end;
      end;
    end;
    FindClose(SRec);
  end;
end;

einfach ein verzeichnis auswählen. aus dem werden dann alle dateien mit der endung ".jpg" ausgelesen (der rest vom dateinamen ist egal) und in das TImage geladen. da wo der kommentar steht, musst du dann einfach noch deinen code zum bearbeiten des bildes einfügen.
 

Friesi

Erfahrenes Mitglied
gut das klappt schonmal :)
mir hat ein freund noch diesen Code hier gegeben .. also damit die Images verkleinert werden.

Code:
procedure TForm1.ResizeImage(newWidth,newHeight: Integer); 
begin 
  SetStretchBltMode(Image2.Canvas.Handle, Halftone); 
  StretchBlt(Image2.Canvas.Handle, 0,0,newwidth,newheight,Image1.Canvas.Handle,0,0,Image1.Width,Image1.Height,SRCCOPY); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
  ResizeImage(50,50); 
end;

kann ich nun in die zeile wo nun mein code hinsoll ein "link" machen das er bei der procedure weiter machen soll?!
denn einfach reinkopieren geht ja nicht.?!
 

Dario Linsky

Erfahrenes Mitglied
du kannst von der stelle im programm eine andere prozedur oder funktion aufrufen, die dann zuerst ausgeführt wird. das passiert ja auch bei deinem code von gerade. aus dem Button2Click() wird die prozedur ResizeImage() aufgerufen.
 

Friesi

Erfahrenes Mitglied
also so:

Code:
 if FindFirst(Dir, faAnyFile, SRec) = 0 then
  begin
    while FindNext(SRec) = 0 do
    begin
      if (SRec.Attr and faAnyFile) = SRec.Attr then
      begin
        if LowerCase(ExtractFileExt(SRec.Name)) = '.jpg' then
        begin
          Image1.Picture.LoadFromFile(SRec.Name);
          ResizeImage(50,50); //Hier geht er dann zur procedure Resize
        end;
      end;
    end;
    FindClose(SRec);
  end;
end;

//start der Procedure Resize
procedure TForm1.ResizeImage(newWidth,newHeight: Integer);
begin
  SetStretchBltMode(Image2.Canvas.Handle, Halftone);
  StretchBlt(Image2.Canvas.Handle, 0,0,newwidth,newheight,Image1.Canvas.Handle,0,0,Image1.Width,Image1.Height,SRCCOPY);
end;

hab nun den button2click ganz weggelassen! müsste er doch nun alles beim button1click machen oder?!

nur wird mal wieder nichts in die TImages ausgegeben!
oder macht er das nun im hintergrund?!
 

Dario Linsky

Erfahrenes Mitglied
wenn du einen button hast, der Button1 heisst und der auch ein onClick-ereigniss hat, dann funktioniert das so.
das bild müsste auch angezeigt werden, allerdings glaub ich, dass das programm während der schleife erstmal hängen wird, und nur das bild zum schluss angezeigt wird. du könntest in die schleife noch die anweisung "Application.ProcessMessages;" einbauen, damit das programm auch weiterläuft. :)
und du könntest noch eine progressbar einbauen, aber das wär wohl etwas zu viel für den anfang. ;)
 

Friesi

Erfahrenes Mitglied
ich bin froh wenn mein delphibuch mal solangsam kommt :)
dann muss ich nicht immer nerven *gg*

ok ich probiere es mal ..
kommt jetzt nur noch das problem des abspeicherns *gg*
 

Friesi

Erfahrenes Mitglied
ach irgendwie will das alles nicht :(
der verkleinert das bild irgendwie nicht!

und kann man das nicht doch irgendwie so machen?!
bild1.jpg


also das man in der Filelistbox die Bilder alles Makiert!
Die dann nach und nach in das Format 50x50 Pixel geändert werden und dann abgespeichert werden?!

find das nämlich mit dieser "Verzeichnis" ansicht schöner :)
 
Zuletzt bearbeitet:

Dario Linsky

Erfahrenes Mitglied
stell das TImage erstmal auf 50 mal 50 pixel ein, setz die eigenschaft "stretched" auf true und die eigenschaft "autosize" auf false. dann wird das bild beim anzeigen automatisch auf 50x50 pixel gestreckt.
das problem dabei ist dann nur noch, dass du das nicht einfach wieder speichern kannst. dann wird nämlich das originalbild wieder gespeichert. du könntest mit TImage.Canvas arbeiten und die anzeige des bildes als datei speichern. oder du machst dir etwas mehr mühe und erzeugst den datenstrom für ein bitmap, indem du jeden pixel aus dem canvas ausliest (50x50.. nicht so viele.. ;)) und damit eine bmp-datei zusammenbastelst. :)
sollte aber beides irgendwie gehen. aus einem bitmap kannst du mit diesem beispiel einfach ein jpeg machen.