![]() |
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:
Wäre nett wenn mir hier jemand helfen könnte. :)
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; Gruß Neomatic |
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?
|
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; |
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:
Oder gibt es eine bessere Methode die ersten 78 bytes abzuschneiden?
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; Gruß Neomatic |
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: |
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) ..
|
AW: Jpeg Bilder aus Access Datenbank auslesen
Pictures inside a database:
Working with BLOBs. Storing pictures in Access ![]() ![]() |
AW: Jpeg Bilder aus Access Datenbank auslesen
Zitat:
Delphi-Quellcode:
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.
{*****************************************************************************
*** 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; 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. |
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) |
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 03:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz