[Delphi] szybkie wczytywanie fotek

0

Witam, napisałem prosty programik do wrzucania fotek na serwer ale mam problem z wczytywaniem do niego zdjęć, a mianowicie zdjęcia wybierane są przez OpenPictureDialog następnie są pomniejszane i dynamicznie są tworzone obiekty TImage. Wszystko działa fajnie tylko jak się wczyta kilkanaście fotek to trzeba chwile czekać aż się pojawią :( Czy można jakoś przyśpieszyć działanie tego programu ? Poniżej zamieszczam funkcję do zmniejszania rozmiaru (znalazłem gdzieś w necie) - program był pisany kilka lat temu i teraz postanowiłem go trochę ulepszyć

function thumb(plik : string; w : integer; h : integer) : TJPEGImage;
var
  JPG : TJPEGImage;
  ratio : double;
  Bmp, Bmp2 : TBitmap;
begin
  JPG := TJPEGImage.Create;
  JPG.LoadFromFile(plik);

  if JPG.Width>JPG.Height then // jesli orientacja pozioma
  begin
    ratio := JPG.Width/w;
    Bmp := TBitmap.Create;
    Bmp.Width := JPG.Width;
    Bmp.Height := JPG.Height;
    Bmp.Canvas.StretchDraw(Rect(0, 0, Bmp.Width - 1, Bmp.Height - 1),JPG);
    ResizeBilinear(Bmp, Bmp2, Round(JPG.Width / ratio), Round(JPG.Height / ratio), JPG.Width, JPG.Height);
  end;
  if JPG.Width<JPG.Height then // jesli orientacja pionowa
  begin
    ratio := JPG.Height/h;
    Bmp := TBitmap.Create;
    Bmp.Width := JPG.Width;
    Bmp.Height := JPG.Height;
    Bmp.Canvas.StretchDraw(Rect(0, 0, Bmp.Width - 1, Bmp.Height - 1),JPG);
    ResizeBilinear(Bmp, Bmp2, Round(JPG.Width / ratio), Round(JPG.Height / ratio), JPG.Width, JPG.Height);
  end;

  JPG.Assign(Bmp2);
  JPG.CompressionQuality := 75;
  JPG.Compress;

  Result := JPG;
end;
0

...a jesli obrazek 1000x1000 to go nie pomniejszy...

a co do samego pytania, to nie wiem co siedzi w ResizeBilinear() i jak szybkie to jest.
mozesz sprobowac uzyc czegos takiego:

      SetStretchBltMode(form1.thumbnail.Canvas.Handle,  HALFTONE); 
      StretchBlt(form1.thumbnail.Canvas.Handle,0,0,r.Right,r.Bottom,
                 image1.Canvas.Handle,0,0,image1.Width,image1.Height,
                 SRCCOPY);

ja tego uzywalem w swoim programie do robienia podgladu - moze bedzie szybsze od Twojego.
a dzieki SetStretchBltMode() zmiejszone obrazki wygladaja "ladnie".

p.s. jesli ladujesz od razu kilka fotek to zrob okienko progressBarem.

0

Podobna prędkość :( obrazka 1000x1000 nie będzie ponieważ to są wczytywane zdjęcia prosto z aparatu - ale zabezpieczę się na tę okoliczność. Progress bar jest ale chciałem to trochę przyśpieszyć.

0
  1. Spróbuj zastosować Intel Jpeg Library do wczytywania obrazków z dysku - wg mnie działa szybciej niż procedury w standardowym module JPEG.
  2. Może uda się wykorzystać TJPEG.Scale do wstępnego zmniejszenia obrazków.
0

Operacja generowania miniatur zazwyczaj trwa dość długo dlatego np. system operacyjny zapisuje je sobie w pliku aby potem z tego korzystać już szybciej.
A w plikach JPG nie ma miniatury w EXIF przypadkiem ?

0

ta miniatura jest podłej jakości i czasem zawiera jakieś dodatkowe shity typu czarny pasek na górze i dole zdjęcia. nie polecam.

problem z powolnym działaniem możesz mieć zawsze, nawet jeśli przyspieszysz generowanie miniatur - bo co się stanie, jeśli będziesz wrzucać nie kilkanaście, a kilkaset plików? proponuję zrobić to na dwóch wątkach, jeden generuje miniatury i wrzuca je do kolejki, drugi wrzuca na serwer cokolwiek znajdzie się w kolejce (i zdejmuje z kolejki po wrzuceniu). a na timerze czy trzecim wątku spokojnie możesz pokazywać stan postępu operacji.

0
  if JPG.Width>JPG.Height then // jesli orientacja pozioma
  begin
    ratio := JPG.Width/w;   <<<<---'CO TU ROBI TO /w' ???
    Bmp := TBitmap.Create;
    Bmp.Width := JPG.Width;
0

stosunek wartości pierwszego wymiaru obrazka do pożądanej wartości pierwszego wymiaru obrazka, żeby było wiadomo jak zeskalować drugi wymiar.

1 użytkowników online, w tym zalogowanych: 0, gości: 1