Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Jpeg Bilder aus Access Datenbank auslesen (https://www.delphipraxis.net/168589-jpeg-bilder-aus-access-datenbank-auslesen.html)

Neomatic 29. Mai 2012 21:35

Datenbank: Access • Version: 2003 • Zugriff über: ADO

Jpeg Bilder aus Access Datenbank auslesen
 
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.

Hier der Code, vieleicht seht ihr ja den Fehler und könnt mir einen Wink mit dem Zaunpfahl geben:

Code:
procedure TfrmBackgroundImage.ImageDBSaveClick(Sender: TObject);
var
  DBImageSave : TStream;
  DBImageLoad : TStream;
  JpegSave : TJPEGImage;
  JpegLoad : TJPEGImage;
begin
  try
    JpegSave := TJPEGImage.Create;
    JpegSave.LoadFromFile(ImagePath.Text);
    DB_ConfigTabelle.Edit;
    DBImageSave := DB_ConfigTabelle.CreateBlobStream
      (DB_ConfigTabelle.FieldByName('RoomBackground'), bmWrite);
    JpegSave.SaveToStream(DBImageSave);

    DBImageLoad := DB_ConfigTabelle.CreateBlobStream
      (DB_ConfigTabelle.FieldByName('RoomBackground'), bmRead);
    DBImageLoad.Position := 0;
    JpegLoad := TJPEGImage.Create;
    JpegLoad.LoadFromStream(DBImageLoad); <-- Hier kommt laut Debugger der Fehler !
    DBImageView.Picture.Assign(JpegLoad);
  finally
    DBImageSave.Free;
    DBImageLoad.Free;
    JpegSave.Free;
    JpegLoad.Free;
  end;
end;
Wäre nett wenn mir hier jemand helfen könnte. :)

Gruß
Neomatic

DeddyH 30. Mai 2012 07:19

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Wenn man einmal nach Access und JPEG sucht, findet man einige Hinweise auf einen OLE-Header, den Access wohl beim Speichern voranstellt. Klappt das Anzeigen, wenn Du die ersten 78 Bytes des Streams nach dem Auslesen entfernst?

Sulki_2000 30. Mai 2012 10:30

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Hallo,

hier ist meine Variante des Speicherns und Ladens in/aus einem Blobfeld einer Paradoxdatei.
Vielleicht hilft es beim experimentieren. Mit Access kenne ich mich nicht aus.
Ich hatte auch Schwierigkeiten beim Speichern und Laden von Jpeg-Bildern.
So hats funktioniert.

Gruß Sullki

Delphi-Quellcode:
procedure TForm1.SaveJPEG(FileName: string);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  FileStream := TFileStream.Create(FileName,fmCreate);
  BlobStream := Table1.CreateBlobStream(Table1.FieldByName('Foto'),bmRead);
  FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
  BlobStream.Free;
  FileStream.Free;
end;

procedure Bild_laden;
var
  JpegImage: TJPEGImage;
  BlobStream: TStream;
begin
  if (not Table1.FieldByName('Foto').IsNull) then
    begin
      BlobStream := Table1.CreateBlobStream(Table1.FieldByName('Foto'),bmRead);
      JpegImage := TJPEGImage.Create;
      try
        try
        JpegImage.LoadFromStream(BlobStream);
        Image1.Picture.Assign(JpegImage);
        Image1.Visible := True;
        except
            //Fehlerbehandlung
           Label148.Caption := 'Fehlerhafter Inhalt';
        end;
      finally
        JpegImage.Free;
        BlobStream.Free;
      end;
    end
  else
    Image1.Visible := False;
end;

Neomatic 30. Mai 2012 20:33

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Hallo,

erstmal danke für eure Antworten. Ich habe versucht die ersten 78 byte des Streams abzuschneiden. Jedoch bleibt das Ergebnis das selbe: Jpeg-Fehler #53

Hier einmal der aktuelle Code:

Code:
procedure TfrmBackgroundImage.ImageDBSaveClick(Sender: TObject);
var
  DBImageSave: TStream;
  DBImageLoad: TStream;
  JpegSave: TJPEGImage;
  JpegLoad: TJPEGImage;
begin
  try
    JpegSave := TJPEGImage.Create;
    JpegSave.LoadFromFile(ImagePath.Text);
    DB_ConfigTabelle.Edit;
    DBImageSave := DB_ConfigTabelle.CreateBlobStream
      (DB_ConfigTabelle.FieldByName('RoomBackground'), bmWrite);
    JpegSave.SaveToStream(DBImageSave);

    DBImageLoad := DB_ConfigTabelle.CreateBlobStream
      (DB_ConfigTabelle.FieldByName('RoomBackground'), bmRead);
    DBImageLoad.Seek(78, soFromBeginning);
    JpegLoad := TJPEGImage.Create;
    JpegLoad.LoadFromStream(DBImageLoad);
    DBImageView.Picture.Assign(JpegLoad);
  finally
    DBImageSave.Free;
    DBImageLoad.Free;
    JpegSave.Free;
    JpegLoad.Free;
  end;
end;
Oder gibt es eine bessere Methode die ersten 78 bytes abzuschneiden?

Gruß
Neomatic

himitsu 30. Mai 2012 22:28

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Speichere die Streams in je einer Datei (einmal bevor's in den BLOB geht und dann nochmal nach dem Auslesen) und vergleiche diese dann.
Oder verwende 2 Streams und vergleiche gleich im Programm.

Versuch das Bild neu zu laden, ohne zwischendurch über den BLOB zu gehn.

Fazit: Schau doch erstmal wo der Fehler liegt, als planlos sonstwo rumzudoktorn. :roll:

Bummi 30. Mai 2012 22:48

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht kommst Du damit weiter (allerdings ist die Idee dahinter verschiedene Formate zu speichern) ..

hathor 30. Mai 2012 23:38

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Pictures inside a database:

Working with BLOBs. Storing pictures in Access

http://delphi.about.com/od/database/l/aa030601a.htm
http://delphi.about.com/library/dbcadopic.zip

Perlsau 31. Mai 2012 06:14

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Zitat:

Zitat von Neomatic (Beitrag 1168645)
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 = 'FF' then begin
          bS.ReadBuffer(buffer, 1);
          hx:=IntToHex(buffer, 2);
          if hx = 'D8' then Result := bS.Position - 2
          else if hx = 'FF' then
           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.

Bummi 31. Mai 2012 07:05

AW: Jpeg Bilder aus Access Datenbank auslesen
 
geht bei mir Problemlos (Access MDB bild=OLE-Objekt=LONGBINARY)
Delphi-Quellcode:
    Adodataset1.Edit;
    SavePicture2Blob(ADODataSet1bild,Image1.Picture);
    AdoDataset1.Post;
    LoadPictureFromBlob(Image2.Picture,ADODataSet1bild)

Furtbichler 31. Mai 2012 07:14

AW: Jpeg Bilder aus Access Datenbank auslesen
 
Ich kann mir vorstellen, das der gewählte Datentyp des Fragestellers 'PICTURE' o.ä. ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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