Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 31. Mai 2012, 07:14
Hallo, ich versuche in eine Access Datenbank Bilder zu speichern und zu laden.
Speichern funktioniert. Nur bekomme ich jedes mal bei dem Versuch das Jpeg Bild zu laden den Jpeg Fehler #53.
MS-Access schneidet beim Einspeichern von JPG-Grafiken den JPEG-Header ab. Den muß man dann beim Anzeigen wieder herstellen. Da ich aber nicht mehr mit Access arbeite, wenn in der DB Grafiken abgelegt werden sollen, kann ich dir nur eine Uralt-Methode vorstellen, mit der ich einmal gearbeitet habe. Mit diesen beiden Methoden werden JPG-Dateien aus einer Access-Datenbank in einem TJpegImage dargestellt:

Delphi-Quellcode:
{*****************************************************************************
*** JPG-HEADER WIEDER HERSTELLEN                                          ***
*****************************************************************************}

FUNCTION JpegStartsInBlob(PicField:TBlobField):integer;
VAR
   bS : TADOBlobStream;
   buffer : Word;
   hx : string;

BEGIN
     Result := -1;
     bS := TADOBlobStream.Create(PicField, bmRead);
     TRY
     WHILE (Result = -1) and (bS.Position + 1 < bS.Size) do
     BEGIN
          bS.ReadBuffer(buffer, 1);
          hx:=IntToHex(buffer, 2);
          if hx = 'FFthen begin
          bS.ReadBuffer(buffer, 1);
          hx:=IntToHex(buffer, 2);
          if hx = 'D8then Result := bS.Position - 2
          else if hx = 'FFthen
           bS.Position := bS.Position-1;
          end; //if
     END; //while
     FINALLY
     bS.Free
     END; //try
END;

{*****************************************************************************
*** BILD LADEN                                                            ***
*****************************************************************************}

PROCEDURE Bild_Laden(Wert : Byte);
VAR
    bS : TADOBlobStream;
    Pic : TJpegImage;
BEGIN
     IF NOT DatMod.ACon.Connected THEN EXIT;

     CASE Wert OF
     1 : bS := TADOBlobStream.Create(DatMod.Aset_WaffenBild, bmRead);
     2 : bS := TADOBlobStream.Create(DatMod.Aset_FunkBild , bmRead);
     END;

     try
        CASE Wert OF
        1 : bS.Seek(JpegStartsInBlob(DatMod.Aset_WaffenBild), soFromBeginning);
        2 : bS.Seek(JpegStartsInBlob(DatMod.Aset_FunkBild) , soFromBeginning);
        END;

        Pic:=TJpegImage.Create;
        try
          Pic.LoadFromStream(bS);
          CASE Wert OF
          1 : FormMain.JvImg_Waffe.Picture.Graphic := Pic;
          2 : FormMain.JvImg_Funk.Picture.Graphic := Pic;
        END;

        finally
               Pic.Free;
        end;
     finally
            bS.Free
     end;
END;
Zum Verständnis: Es handelt sich dabei um eine nicht fertiggestellte Anwendung für einen kleinen Waffenfachhändler, der seine gesammelten Kenntnisse über Schußwaffen in einer Datenbank speichern wollte. Er bekam dann eine Anwendung mit Firebird-Datenbank, mit der sich quasi alles problemlos speichern und abrufen läßt.

Der übergebene Byte-Wert in der Procedure Bild_Laden bestimmt, aus welchem Blob-Feld die Datei abgerufen wird. Ich hatte es damals nicht hinbekommen, JPG-Grafiken via Delphi-Programm in Access einzulesen, die in der DB vorhandenen Bilder wurden direkt mit der Access-Anwendung eingespeist. Aber das kriegst du sicher selber noch aus, wie das geht. Am besten, du verwendest Access erst gar nicht, wenn du Grafiken oder TDBRich oder sonstigen Binärkram in deiner Datenbank speichern möchtest.
  Mit Zitat antworten Zitat