Autor Beitrag
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: Fr 24.05.13 08:35 
Servus!

Momentan arbeite ich an einem Projekt, bei dem immer wieder von einer Überwachungskamera aufgenommene Bilder verglichen werden müssen. Manchmal sind die Bilddateien aber fehlerhaft und ich erhalte die Meldung

Jpeg-Fehler #58

Dazu fand ich diese Information:

Function
The "JPEG Error 58" occurs because of a corrupt image file is causing incompatibility with the software. Incomplete image files or images with encoded data could cause this to happen.


Das ist aber sehr unangenehm, weil dann das Programm stehenbleibt, und dann aus über 40.000 Aufnahmen die defekte raussuchen macht wirklich keinen Spaß. Jetzt suche ich nach einer Möglichkeit entweder defekte Bilder schon vorher auf Fehlerfreiheit zu prüfen oder bei Fehlern einfach zur nächsten Aufnahme überzugehen.

So sieht mein Code momentan aus – wie könnte ich ihn dahingehend verbessern?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  Bild1Stream:= TMemoryStream.Create;
  jpeg := TJPEGImage.Create;
  try
    jpeg.LoadFromFile(Jpeg1Name);
    bmp := TBitmap.Create;
    try
      bmp.Assign(jpeg);//Hier wird die Fehlermeldung aufgeworfen
      bmp.SaveToStream(Bild1Stream);
    finally
      bmp.Free
    end;
  finally
    jpeg.Free
  end;
  Bild1Stream.Position := 0;


Gruß,

Adrian
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Fr 24.05.13 09:28 
Ich habe mal den Link für die Error-Codes gesucht und gefunden.

www.efg2.com/Lab/Lib...phics/JpegErrors.txt

Das hilft Dir jetzt zwar nicht weiter, doch weißt Du wenigstens annähernd, was dieser Fehler bedeutet. Allerdings scheint ja wohl die Fehlerabfangprozedur Try Except in dem Falle nicht zu funktionieren. Warum auch immer. Was ergibt denn die Variable jpeg, wenn der Fehler auftritt? Ist da irgendwas zu machen?

Alternativ kannst du ja jpeg selber auf den Strem legen, statt erst ein bmp daraus zu machen. Vielleicht löst das das Problem.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Bild1Stream:= TMemoryStream.Create;
  jpeg := TJPEGImage.Create;
  try
    jpeg.LoadFromFile(Jpeg1Name);
    try
      jpeg.SaveToStream(Bild1Stream);
    except
//      Ausgabe einer Fehlermeldung
    end;
  finally
    jpeg.Free
  end;
  Bild1Stream.Position := 0;

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 24.05.13 13:45 
Tranx, das mit der Bitmap wird wohl Absicht sein. Da Ausweten der Bilder ist doch einfacher, wenn man das Bild hat und nicht einen anderen komprimierten Stream. Auf dem richtigen Weg ist das try-except allerdings schon, das würde um die Zeile mit bmp.assign drumrum gehören. Aus der IDE gestartet würde der Fehler immer noch angezeigt werden, aber danach gehts weiter. Im except-Block könnte man z.B. etwas loggen.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Adrian Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: So 26.05.13 12:33 
Servus!

Ja, die Umwandlung in BMP war beabsichtigt und hatte den Hintergrund, daß damit ein Bildvergleich wesentlich einfacher zu realisieren war.
Ich konnte es zwar weiterhin nicht bewerkstelligen, daß beim Auftreten des Fehlers eine behandelbare Exception ausgelöst wird, aber mittlerweile habe ich den Programmablauf so weit umgestrickt, daß ich dort, wo der Fehler auftrat, weitermachen kann. Da ich während des Ablaufs sowieso in unmittelbarer Nähe des PCs bin, ist das eigentlich kein Problem.
Danke für eure Hilfe.

Gruß,

Adrian