Masowe wczytywanie Jpeg 'ow

0

Witam, w timerku napisalem kodzik, ktory wrzuca z dysku co sekunde zdjecie (jpg) do TImage, jednak po kilkunastym zdjeci wyskakuje mi blad: JPEG error # 42, podejrzewam ze jest to przepelnienie pamieci :], ale nie wiem jak rozwiazac ten problem wiec jesli mozecie to wskazcie mi blad w ponizszym kodziku:

procedure TForm2.Timer1Timer(Sender: TObject);
begin
if FileExists (zrodlo + '\screen' + IntToStr(slajd) + '.jpg') then
 begin
  Image1.Picture.LoadFromFile(zrodlo + '\screen' + IntToStr(slajd) + '.jpg');
  Label2.Caption := IntTOStr(slajd);
  Inc(slajd);
 end
else
 begin
  Timer1.Enabled := false;
  showmessage ('Koniec sesji');
 end;
end;

0

Ok moj blad, program nie dzialal prawidlowo gdyz probowal wczytac jpg ktotre zajmuja 0 KB, sorki za zakret - kodzik jest dobry

0

Może spróbuj załadować np.: do tablicy strumieni wszystkie klatki, a potem tylko:

Image1.Picture.LoadFromStream(Stream[Klatka]);

Może będzie szybciej. Jeśli klatki są duże te ewentualnie ładuj do drugiego

Image.Picture, a potem Image1.Picture.Assign(Image.Picture);
0

Ok a teraz moze z innej beczki, czy wie ktos jak mozna przescalowac zdjecie nie tracac zbytnio na jakosci ?

Aktualnie scaluje w taki sposob:

B.Canvas.CopyRect(Rect(0, 0, 800, 640), Can, Rect(0, 0, 1024, 768 ));

Jednak po scalowaniu jakosc zdjecia jest okropna :/ - ustawialem nawet quality na duzo, ale efekt taki sobie pomijajac fakt ze przescalowany obraz zajmuje strasznie duzo miejsca i jest gorszej jakosci, czy wie ktos jak mozna rozwiazac ten problem ?

0

Witam, w timerku napisalem kodzik, ktory wrzuca z dysku co sekunde zdjecie (jpg) do TImage, jednak po kilkunastym zdjeci wyskakuje mi blad: JPEG error # 42, podejrzewam ze jest to przepelnienie pamieci , ale nie wiem jak rozwiazac ten problem wiec jesli mozecie to wskazcie mi blad w ponizszym kodziku:

procedure TForm2.Timer1Timer(Sender: TObject);
begin
if FileExists (zrodlo + '\screen' + IntToStr(slajd) + '.jpg') then
begin
Image1.Picture.LoadFromFile(zrodlo + '\screen' + IntToStr(slajd) + '.jpg');
Label2.Caption := IntTOStr(slajd);
Inc(slajd);
end
else
begin
Timer1.Enabled := false;
showmessage ('Koniec sesji');
end;
end;

Twój program po kilkunastu sekundach trafia na takiego JPG, który jest teoretycznie źle zapisany. Kiedyś miałem taki problem, więc konwertowałem JPG na tymczasowe BMP i było super. Spróbuj odczytywać inny folder z JPG lub poszukaj na którym to JPG się wysypuje i usuń go z folderu i jeszcze raz uruchom program. Pozdro.

0

moim zdaniem powinienes obsluzyc jakos ten wyjatek bo co bedzie jak ktos inny zaladuje pustego jpga?

0
dRum napisał(a)

Ok a teraz moze z innej beczki, czy wie ktos jak mozna przescalowac zdjecie nie tracac zbytnio na jakosci ?

Zrób pętlę sprawdzającą wszystkie piksele obszaru wynikowego i wyznaczającą danemu punktowi jaki przysługuje pixel źródłowy. (używając ScanLinie powinno być wystarczająco szybko). [w FAQ na podobnej zasadzie zrobiłem obracanie bitmap].

0
type
  TJpgViewerMain=class(TForm)
    BtnNext: TButton;
    Image:TImage;
    procedure FormCreate(Sender:TObject);
    procedure FormDestroy(Sender:TObject);
    procedure BtnNextClick(Sender:TObject);
  private
    Path:String;
    Sr:TSearchRec;
    Jpg:TJPEGImage;
  public
  end;

implementation

procedure TJpgViewerMain.FormCreate(Sender:TObject);
begin
  Jpg:=TJPEGImage.Create;
  Path:='c:\';
  BtnNext.Enabled:=FindFirst(Path+'*.jpg',faArchive,Sr)=0;
  if BtnNext.Enabled then
  begin
    Jpg.LoadFromFile(Path+Sr.Name);
    Image.Hint:=Sr.Name;
    Image.Picture.Assign(Jpg);
  end;
end;

procedure TJpgViewerMain.FormDestroy(Sender:TObject);
begin
  if BtnNext.Enabled then FindClose(Sr);
  Jpg.Free;
end;

procedure TJpgViewerMain.BtnNextClick(Sender:TObject);
begin
  if FindNext(Sr)<>0 then
  begin
    FindFirst(Path+'*.jpg',faArchive,Sr);
  end;
  Jpg.LoadFromFile(Path+Sr.Name);
  Image.Hint:=Sr.Name;
  Image.Picture.Assign(Jpg);
  ScrollBoxResize(Sender);
end;

Zamiast przycisku moze byc Timer, i nie trzeba numerowac plikow.

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