jpeg- fehler #53
ich habe den Fehler(jpeg- fehler #53 ).
das Problem in mein Programm,dass ich keine Befehle finde ,mit der kann mein Programm die type von Bild(BItmap oder jpeg)anerkenn. wie kann ich es als bedigung schreiben(if ___) ??? |
AW: jpeg- fehler #53
.. Du könntest nach der Datei extension gehen.
Oder dies nach Delphi überstzen (magic Bytes) -> https://oroboro.com/image-format-magic-bytes/ Grüße Klaus |
AW: jpeg- fehler #53
Zitat:
Delphi-Quellcode:
procedure TFormFoto.ZeigeFoto(DB: String; ID: TiBtrvID);
var lpTblGraph: TpBtrvDBTableData; lbmpImage: TBitmap; lmstImage: Tmemorystream; laImage : TaByte; lgrpImage: TGraphic; ljpgImage: TJPEGImage ; begin lbmpImage := nil; lmstImage := nil; ljpgImage :=nil; try //lbmpImage := TBitmap.Create; lmstImage := Tmemorystream.Create; ljpgImage := TJPEGImage.Create; lpTblGraph := RelData('GR'); PutSField('GR', 1, DB); PutIdField('GR', 2, ID); if lGetRecord(lpTblGraph, 1) then begin laImage := GetBlob(lpTblGraph); lmstImage.Clear; lmstImage.Write(laImage[0], Length(laImage)); lmstImage.Position := 0; ljpgImage.LoadFromStream(lmstImage); lbmpImage := TBitmap.Create; try lbmpImage.Assign(ljpgImage); lgrpImage.Free; lgrpImage := lbmpImage; Image1.picture.Graphic := (lbmpImage); Except lbmpImage.Transparent := True; lbmpImage.LoadFromStream(lmstImage); lbmpImage.TransparentColor := lbmpImage.Canvas.Pixels[0, lbmpImage.Height - 1]; lbmpImage.ReleaseMaskHandle; lgrpImage.Free; lgrpImage := lbmpImage; Image1.picture.Graphic := (lgrpImage); end; FormFoto.Caption := DB + '-' + IntToStr(ID); FotoResize; end else begin lgrpImage := nil; end; finally lbmpImage.Free; lmstImage.Free; ljpgImage.Free; end; end; |
AW: jpeg- fehler #53
.. dann wäre es sinnvoll die ersten Bytes des Memorystreams auszuwerten (magic Bytes).
Grüße Klaus |
AW: jpeg- fehler #53
Im Stream steht doch dann alles, was Du brauchst. Alternativ könnte man auch einfach beim Abspeichern alle Bilder in JEPG konvertieren und das dann speichern. Da weiß man, was man hat.
|
AW: jpeg- fehler #53
Ungefähr sowas:
Delphi-Quellcode:
Ob die Prüfung vollständig ist, weiß ich nicht, aber seitdem ich das nutze, bekomme ich den Fehler #53 nicht mehr zu sehen.
function GetIsJPG(fFilename : String) : Boolean;
var Buffer : packed array[0 .. 9] of Byte; BytesRead : DWORD; fFileHandle : THandle begin fFileHandle := CreateFile(PAnsiChar(fFileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, 0, 0); Result := fFileHandle <> INVALID_HANDLE_VALUE; if Result then begin FillChar(Buffer, SizeOf(Buffer), 0); SetFilePointer(fFileHandle, 0, nil, FILE_BEGIN); Result := ReadFile(fFileHandle, Buffer, SizeOf(Buffer), BytesRead, nil) and (BytesRead >= SizeOf(Buffer)) and ( ((Buffer[0] = $FF) and (Buffer[1] = $D8) and (Buffer[2] = $FF)) or ((Buffer[6] = $4A) and (Buffer[7] = $46) and (Buffer[8] = $49) and (Buffer[9] = $46)) ); end; end; Die Dateiendung ist nicht zuverlässig, im Web findet man etliche JPG-Dateien (zumindest der Dateiendung nach) die in Wirklichkeit PNGs sind. Bei 'nem Stream musst Du die Abfrage entsprechend anpassen, es sind die Bytes 0 bis 2 bzw. 6 bis 9 zu prüfen. Damit ist man eigentlich recht zuverlässig in der Erkennung. |
AW: jpeg- fehler #53
Zitat:
|
AW: jpeg- fehler #53
Hallo,
bevor ich auf GDI+ umgestiegen bin, hab ich das so getestet:
Delphi-Quellcode:
type
TPictureTyp = (pw_None, pw_BMP, pw_JPG, pw_PNG); function PictureTyp_pruefen(const Picture: String): TPictureTyp; var FileHandle: Integer; Buffer : Word; begin //Datei öffnen und die ersten 2 Bytes auslesen FileHandle := FileOpen(Picture, fmOpenRead); FileSeek(FileHandle, 0, 0); FileRead(FileHandle, Buffer, 2); FileClose(FileHandle); //High-Byte und Low-Byte im Buffer tauschen //(dadurch stimmt die Byte-Anordnung wieder mit der in der Bild-Datei überein) Buffer := Swap(Buffer); //Prüfung ob BMP, JPG oder PNG case Buffer of $424D: Result := pw_BMP; $FFD8: Result := pw_JPG; $8950: Result := pw_PNG; else Result := pw_None; end; end; |
AW: jpeg- fehler #53
Zitat:
Delphi-Quellcode:
FileHandle := FileOpen(Picture, fmOpenRead);
FileSeek(FileHandle, 0, 0); FileRead(FileHandle, Buffer, 2); FileClose(FileHandle); |
AW: jpeg- fehler #53
.. du könntest bei TMemoryStream bleiben.
Delphi-Quellcode:
Nur sehe ich in Deinem Code nicht, wie der MemoryStream "lmstImage" gefüllt wird.
type
TPictureTyp = (pw_None, pw_BMP, pw_JPG, pw_PNG); function PictureTyp_pruefen(const imageStream: TMemoryStream): TPictureTyp; var Buffer : Word; begin imageStream.Read(Buffer,2); //High-Byte und Low-Byte im Buffer tauschen //(dadurch stimmt die Byte-Anordnung wieder mit der in der Bild-Datei überein) Buffer := Swap(Buffer); //Prüfung ob BMP, JPG oder PNG case Buffer of $424D: Result := pw_BMP; $FFD8: Result := pw_JPG; $8950: Result := pw_PNG; else Result := pw_None; end; end; Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz