AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Jpeg Bilder aus Access Datenbank auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Jpeg Bilder aus Access Datenbank auslesen

Ein Thema von Neomatic · begonnen am 29. Mai 2012 · letzter Beitrag vom 31. Mai 2012
Antwort Antwort
Neomatic

Registriert seit: 29. Jan 2012
4 Beiträge
 
#1

Jpeg Bilder aus Access Datenbank auslesen

  Alt 29. Mai 2012, 21:35
Datenbank: Access • Version: 2003 • Zugriff über: ADO
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 30. Mai 2012, 07:19
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Sulki_2000

Registriert seit: 7. Jul 2009
2 Beiträge
 
#3

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 30. Mai 2012, 10:30
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;
  Mit Zitat antworten Zitat
Neomatic

Registriert seit: 29. Jan 2012
4 Beiträge
 
#4

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 30. Mai 2012, 20:33
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 30. Mai 2012, 22:28
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Mai 2012 um 22:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 30. Mai 2012, 22:48
Vielleicht kommst Du damit weiter (allerdings ist die Idee dahinter verschiedene Formate zu speichern) ..
Angehängte Dateien
Dateityp: pas LoadSaveImageBlobs.pas (1,9 KB, 24x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 30. Mai 2012, 23:38
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

Geändert von hathor (31. Mai 2012 um 07:24 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 31. Mai 2012, 06: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
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 31. Mai 2012, 07:05
geht bei mir Problemlos (Access MDB bild=OLE-Objekt=LONGBINARY)
Delphi-Quellcode:
    Adodataset1.Edit;
    SavePicture2Blob(ADODataSet1bild,Image1.Picture);
    AdoDataset1.Post;
    LoadPictureFromBlob(Image2.Picture,ADODataSet1bild)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Jpeg Bilder aus Access Datenbank auslesen

  Alt 31. Mai 2012, 07:14
Ich kann mir vorstellen, das der gewählte Datentyp des Fragestellers 'PICTURE' o.ä. ist.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 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