Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bild (BLOB) aus SQLite DB in TImage übertragen (https://www.delphipraxis.net/217071-bild-blob-aus-sqlite-db-timage-uebertragen.html)

FediDelPr 20. Apr 2025 23:24

Datenbank: SQLite • Version: 3 • Zugriff über: FireDac

Bild (BLOB) aus SQLite DB in TImage übertragen
 
Liebe Delphianer,

Mittlerweile geling es mir vermutlich Bilder von TImage als BLOB in eine SQLite DB zu schreiben.
Warum vermutlich: weil ich's noch nicht wirklich verifizieren konnte.

Daher möchte ich jetzt den umgekehrten Weg implementieren: Auslesen eines des Bildes in der DB und wieder Speicherung in einem TImage.

Kann mir da jemand helfen?

Gruss

FediDelPr 20. Apr 2025 23:55

Korr: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Entschuldigt, es ist mir ein Fehler unterlaufen:

Die Speicherung des BLOBs in die DB erfolgt nicht von TImage aus, sondern von TMemoryStream.

Die folgenden beiden Zeilen mit LoadFromFile() laden das Bild in den MemoryStream ms bzw. in Image1
und wird damit angezeigt.

VAR ms: TMemoryStream;

ms.LoadFromFile('C:\Users\.....\IMG_2880.jpg');
Image1.Picture.LoadFromFile('C:\Users\.....\IMG_28 80.jpg');

Die Übertragung in die DB erfolgt übrigens mit INSERT INTO ...

Rücklesen
Die Aufgabe des Rücklesens besteht aus folgenden Schritten:
1. Auslesen des BLOBs aus DB und Speicherung in Stream
2. Stream in TImage übertragen

oder

vielleicht gibt es für 1. und 2. eine Kombination.

peterbelow 21. Apr 2025 12:23

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Ganz so einfach ist das Lesen nicht, da das Format des Bildes nicht ohne aufwendige Analyse des TBlobStream-Inhaltes aus den BLOB-Daten ermittelt werden kann. TImage oder TPicture.LoadFromFile benutzt halt die Datei-Extension um intern die richtige Graphic-Klasse (TBitmap, TPngImage, TJPegImage etc.) zu ermitteln, davon eine Instanz zu erzeugen, deren LoadFromFile-Methode aufzurufen und die Instanz an Image.Picture.Graphic zuzuweisen.

Die einfachste Lösung für dich ist das Imageformat in einem anderen Feld der Datentabelle mit abzuspeichern, z. B. die Datei-Extension der Orginaldatei. Du kannst die BLOB-Daten dann in eine temporäre Datei mit der gespeicherten Extension schreiben und die dann in das Image laden.

mytbo 21. Apr 2025 14:13

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Zitat:

Zitat von FediDelPr (Beitrag 1548135)
Mittlerweile geling es mir vermutlich Bilder von TImage als BLOB in eine SQLite DB zu schreiben.

Diese Artikel enthalten Beispiele, die das Gewünschte umsetzen:Vielleicht findest du hier eine Anregung.

Bis bald...
Thomas

haentschman 22. Apr 2025 07:28

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Hallöle...8-)

@mytbo: ist mORMot in diesem Falle nicht etwas übertrieben? :zwinker:

Zitat:

Ganz so einfach ist das Lesen nicht, da das Format des Bildes nicht ohne aufwendige Analyse des TBlobStream-Inhaltes aus den BLOB-Daten ermittelt werden kann.
Im Prinzip richtig. Aber aufwendig ist es nicht...:zwinker: Das Format des Bildes steht im Header des Streams.
Beispiel:
https://www.delphipraxis.net/155578-...-erkennen.html
Liste der Header:
https://en.wikipedia.org/wiki/List_of_file_signatures

:wink:

mytbo 22. Apr 2025 13:52

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Zitat:

Zitat von haentschman (Beitrag 1548157)
@mytbo: ist mORMot in diesem Falle nicht etwas übertrieben? :zwinker:

mORMot ist für mich nicht nur ein weiteres Framework, sondern das Fundament meiner Pascal-Entwicklung. Ohne mORMot wäre Pascal in meinem Umfeld nicht mehr konkurrenzfähig - ich müsste mich von ihr als Entwicklungsplattform verabschieden. Ohne mORMot keine Embarcadero Delphi Subscription.

Bis bald...
Thomas

Frickler 24. Apr 2025 09:47

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Zitat:

Zitat von peterbelow (Beitrag 1548146)
TImage oder TPicture.LoadFromFile benutzt halt die Datei-Extension um intern die richtige Graphic-Klasse (TBitmap, TPngImage, TJPegImage etc.) zu ermitteln, davon eine Instanz zu erzeugen, deren LoadFromFile-Methode aufzurufen und die Instanz an Image.Picture.Graphic zuzuweisen.

Das fällt einem dann auf die Füße, wenn mal wieder PNG Dateien mit der Erweiterung JPG gespeichert wurden. Keine Ahnung, wer das wo verbricht, aber diese Dateien begegnen mir in meinem Umfeld (Marketing Material) oft genug, so dass ich jedes Mal vor dem Laden teste.

P.S.: Wenn man diese Dateien mit IrfanView öffnet, bietet einem das Programm an, die falsche Erweiterung umzubenennen.

HolgerX 24. Apr 2025 10:31

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Hmm..

Zitat:

Zitat von Frickler (Beitrag 1548221)
Zitat:

Zitat von peterbelow (Beitrag 1548146)
TImage oder TPicture.LoadFromFile benutzt halt die Datei-Extension um intern die richtige Graphic-Klasse (TBitmap, TPngImage, TJPegImage etc.) zu ermitteln, davon eine Instanz zu erzeugen, deren LoadFromFile-Methode aufzurufen und die Instanz an Image.Picture.Graphic zuzuweisen.

Das fällt einem dann auf die Füße, wenn mal wieder PNG Dateien mit der Erweiterung JPG gespeichert wurden. Keine Ahnung, wer das wo verbricht, aber diese Dateien begegnen mir in meinem Umfeld (Marketing Material) oft genug, so dass ich jedes Mal vor dem Laden teste.

P.S.: Wenn man diese Dateien mit IrfanView öffnet, bietet einem das Programm an, die falsche Erweiterung umzubenennen.

Das kommt z.B. dann vor, wenn jemand ein Bild aus dem Internet geladen hat!
Dort ist als Link ein .jpg Bild aber der Server schickt dann (unter diesem Namen) auch mal gerne ein PNG oder WEBP.
Dem Browser ist dies zur Anzeige egal, jedoch nicht dem "Bild Speichern unter", welches den JPG Filenamen verwendet.

dataspider 24. Apr 2025 10:57

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Ich nutze hier TWICImage, da ich hier von einem Stream laden kann:

Beispielcode aus meinem ImagViewer:
Delphi-Quellcode:
procedure TImageViewer.doLoadFromStream(AStream: TStream);
Var
  AImage: TWICImage;
begin
  AImage := TWICImage.Create;
  try
    AImage.LoadFromStream(AStream);
    ImageView.Picture.Bitmap.Assign(AImage);
  finally
    AImage.Free;
  end;
end;

Frank

himitsu 24. Apr 2025 15:50

AW: Bild (BLOB) aus SQLite DB in TImage übertragen
 
Warum TImage?


PS: in 10.4 müsste es direkt/automatisch gehen, also mit Delphi-Referenz durchsuchenTDBImage
oder via Image.Picture.LoadFromStream

Früher ging es beim LoadFromFile automatisch, über die Dateiendung,
aber bei LoadFromStream mußte man genau aufpassen, welches Dateiformat drin steckt.

Aber inzwischen arbeitet "dieses" LoadFromStream mit MagicBytes, um sich zum Dateiformat den passenden TGrafic-Typ zu besorgen.
(wenn die Unit für den notwendigen Typ im Programm eingebunden ist)


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