Avatar billede bolorolo Nybegynder
05. august 2013 - 20:59 Der er 8 kommentarer

resize jpg fra listbox

Hejsa.

jeg vil høre om nogle kan hjælpe mig med dette lille program
jeg har en listbox1 som bliver fodret med paths til jpg billeder
som skal resizes og gemmes på samme lokation (path) med samme fil navn. eks. c:\arkiv\resizes\test.jpg

jeg har med lidt hjælp kommet frem til denne stykke kode, men det bruger opendialog , filename, hvordan kan man få den til at loade filerne listet til listboxen en efter en og gemme dem igen ?

koden ser således ud:

procedure TForm1.Button4Click(Sender: TObject);
var
  bmp: TBitmap;
  jpg: TJpegImage;
  scale: Double;
begin
  if opendialog1.execute then
  begin
    jpg := TJpegImage.Create;
    try
      jpg.Loadfromfile(opendialog1.filename);
      if jpg.Height > jpg.Width then
        scale := 50 / jpg.Height
      else
        scale := 50 / jpg.Width;
      bmp := TBitmap.Create;
      try
        {Create thumbnail bitmap, keep pictures aspect ratio}
        bmp.Width := Round(jpg.Width * scale);
        bmp.Height:= Round(jpg.Height * scale);
        bmp.Canvas.StretchDraw(bmp.Canvas.Cliprect, jpg);
        {Draw thumbnail as control}
        Self.Canvas.Draw(100, 10, bmp);
        {Convert back to JPEG and save to file}
        jpg.Assign(bmp);
        jpg.SaveToFile(opendialog1.filename);
      finally
        bmp.free;
      end;
    finally
      jpg.free;
    end;
  end;
end;
end.
Avatar billede 2Mida Praktikant
05. august 2013 - 23:51 #1
Du skal ikke bruge OpenDialog, men FindFirst/FindNext

procedure FileSearch(const PathName, FileName : string) ;
var Rec : TSearchRec;
Path : string;
begin
Path := IncludeTrailingPathDelimiter(PathName) ;
if FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
ListBox1.Items.Add(Path + Rec.Name) ;
until FindNext(Rec) <> 0;
finally
FindClose(Rec) ;
end;
end;

så får du en liste af jpegs filnavne som du kan bearbejde - isoler selve behandlinegn af billedet i sin egen procedurer/function
Avatar billede bolorolo Nybegynder
06. august 2013 - 18:02 #2
Det kommer ikke rigtigt til at kunne løse det, det er nemlig nogle bestemte billeder og lokationer som listboxen bliver fodret med.

man skal man lave selve resize proceduren til en funktion og kalde den når man skal bearbejde de filer med path som er angivet i listboxen ?

resize som fuktion

listbox1.items(resize) <>=;
end;
end.

Eller er jeg helt forkert på den ?
Avatar billede kroning Nybegynder
06. august 2013 - 18:40 #3
Utestet:

procedure TForm1.Button4Click(Sender: TObject);
var
  bmp: TBitmap;
  jpg: TJpegImage;
  scale: Double;
  i : integer;
begin
    for i:=0 to ListBox1.Count-1 do
  begin
    jpg := TJpegImage.Create;
    try
      jpg.Loadfromfile(ListBox1.Items[i]);
      if jpg.Height > jpg.Width then
        scale := 50 / jpg.Height
      else
        scale := 50 / jpg.Width;
      bmp := TBitmap.Create;
      try
        {Create thumbnail bitmap, keep pictures aspect ratio}
        bmp.Width := Round(jpg.Width * scale);
        bmp.Height:= Round(jpg.Height * scale);
        bmp.Canvas.StretchDraw(bmp.Canvas.Cliprect, jpg);
        {Draw thumbnail as control}
        Self.Canvas.Draw(100, 10, bmp);
        {Convert back to JPEG and save to file}
        jpg.Assign(bmp);
        jpg.SaveToFile(ListBox1.Items[i]);
      finally
        bmp.free;
      end;
    finally
      jpg.free;
    end;
  end;
end;
Avatar billede bolorolo Nybegynder
06. august 2013 - 18:59 #4
1000 tak, det hjalp mig :-)
Avatar billede bolorolo Nybegynder
10. august 2013 - 05:12 #5
Jeg er støt på et lille problem med koden, hvis en jpg fil er åben i andet program når koden tager fat i jpg filen, så kommer der en jpg fejl #51 , kan man indbygge en exit on error ? alså så min application lukker hvis den støder på en fil som er åben.

Det er nemlig tanken at programmet løbende skal køre i takt med det kommer jpg filer ind, trigget af en scheduler, så det den ikke kan håndtere hvis filen er åben m.m klarer den bare senere når den kører. Det ville være smart hvis man kunne lukke programmet istedet for den stopper hele møllen med en popup fejl som der aktivt skal trykkes på.

jeg har prøvet at google mig lidt frem , skal man selv skrive en exit kode i programmet, eller har delphi en indbygget event på errors som man på en eller anden måde kan trigge en form1.close; på ?
Avatar billede kroning Nybegynder
10. august 2013 - 11:14 #6
Prøv med

procedure TForm1.Button4Click(Sender: TObject);
var
  bmp: TBitmap;
  jpg: TJpegImage;
  scale: Double;
  i : integer;
begin
  try
    for i:=0 to ListBox1.Count-1 do
  begin
    jpg := TJpegImage.Create;
    try
      jpg.Loadfromfile(ListBox1.Items[i]);
      if jpg.Height > jpg.Width then
        scale := 50 / jpg.Height
      else
        scale := 50 / jpg.Width;
      bmp := TBitmap.Create;
      try
        {Create thumbnail bitmap, keep pictures aspect ratio}
        bmp.Width := Round(jpg.Width * scale);
        bmp.Height:= Round(jpg.Height * scale);
        bmp.Canvas.StretchDraw(bmp.Canvas.Cliprect, jpg);
        {Draw thumbnail as control}
        Self.Canvas.Draw(100, 10, bmp);
        {Convert back to JPEG and save to file}
        jpg.Assign(bmp);
        jpg.SaveToFile(ListBox1.Items[i]);
      finally
        bmp.free;
      end;
    finally
      jpg.free;
    end;
  end;
  except
      close;
    end;
end;
Avatar billede bolorolo Nybegynder
10. august 2013 - 13:37 #7
Hmmm den bliver ved med at give mig en fejl #51
på denne linje:

if jpg.Height > jpg.Width then

"Project1.exe raised excepton class EJPEG with message 'JPEG error #51'. process stopped.
Avatar billede kroning Nybegynder
10. august 2013 - 14:32 #8
Det er vel kun i din IDE
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester