AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Image mit FMX in DB speichern und zurücklesen

Image mit FMX in DB speichern und zurücklesen

Ein Thema von jangbu · begonnen am 29. Jun 2020 · letzter Beitrag vom 30. Jun 2020
Antwort Antwort
jangbu

Registriert seit: 6. Apr 2006
168 Beiträge
 
Delphi 10.3 Rio
 
#1

Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 13:38
Datenbank: MS-SQL • Version: 2014 • Zugriff über: SDAC
Hallo,

ich speichere mit meiner FMX Application images als blob in der MS-SQL-DB, kann sie korrekt wieder zurücklesen und auch wieder als image anzeigen. DaAbei benutze ich folgenden Code:

Code:
procedure TForm2.btn_save_to_DBClick(Sender: TObject);
var
  MStream : TMemoryStream;
begin
  MStream := TMemoryStream.Create;
  try
    MSQuery1.SQL.Text := 'INSERT INTO sign (ID,image1,DateTime,ok) VALUES (:ID,:image1,:DateTime,:ok)';
    Image1.Bitmap.SaveToStream(MStream)
    MStream.Seek(0,0);
    try
      MSQuery1.ParamByName('ID').AsInteger := 109;
      MSQuery1.ParamByName('image1').LoadFromStream(MStream, ftBlob);
      MSQuery1.ParamByName('DateTime').AsDateTime := now;
      MSQuery1.ParamByName('ok').AsBoolean := false;
      MSQuery1.ExecSQL();
    except
      on E: Exception do
        ShowMessage('Error on ExecSQL! ' + e.Message);
    end;
    MStream.Free;
  finally
    MSQuery1.Close;
  end;
end;

procedure TForm2.btn_readClick(Sender: TObject);
var BlobStream : TStream;
begin
  if not MSConnection1.Connected then
    MSConnection1.Connected := true;
    try
      MSQuery1.Close;
      MSQuery1.SQL.Clear;
      MSQuery1.SQL.Add('select * from sign where id = ''' + edt_id.Text + '''');
      MSQuery1.Open;
      BlobStream := MSQuery1.CreateBlobStream(MSQuery1.FieldByName('image1'),TBlobStreamMode.bmRead);

      Image3.Bitmap.LoadFromStream(BlobStream); // *** FMX-Version***

      BlobStream.Free;
    except
      on E: Exception do
        ShowMessage('Fehler bei lesen blob from DB ' + e.Message);
    end;
end;
Das funktioniert alles wunderbar!

Wenn ich jedoch mit einer windows-VCL-Application versuche die Images von der DB wieder zurückzulesen, die mit der FMX-Applikation (Android) in die DB geschrieben wurden, bekomme ich den Fehler:

"DB Bitmap ist ungültig"

Code:
procedure TfrmMain.btn_read_from_DBClick(Sender: TObject);
var BlobStream : TStream;
begin
  if not MSConnection1.Connected then
    MSConnection1.Connected := true;
    try
      MSQuery1.Close;
      MSQuery1.SQL.Clear;
      MSQuery1.SQL.Add('select * from sign where id = ''' + edt_id.Text + '''');
      MSQuery1.Open;

      BlobStream := MSQuery1.CreateBlobStream(MSQuery1.FieldByName('image1'),TBlobStreamMode.bmRead);

      Image2.Picture.Bitmap.LoadFromStream(BlobStream); // *** VCL-Version

      BlobStream.Free;
    except
      on E: Exception do
        ShowMessage('Fehler bei lesen blob from DB ' + e.Message);
    end;
end;
Fazit: mit FMX gespeicherte Images lassen sich auch mit FMX wieder zurücklesen, das gleiche gilt für VCL. Wie lassen sich jedoch mit FMX gespeicherte Images mit VCL korrekt zurücklesen und anzeigen?

jangbu
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#2

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 15:01
Je nach Platform werden verschiedene Formate unterstützt.
Ich bin da auch nicht sicher ob die dann immer 100% übereinstimmen,
ich vermute mal da gibt es auch kleine Implementierungsunterschiede, je nach Platform.

Ich würde versuchen das über ein PNG oder JPG als einigermaßen standarisiertes Transferformat zu speichern.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 16:24
Mal von dem grundsätzlichen Hinweis von Rollo62 abgesehen:

Unter FMX ist das Standard-"Bitmap" eine PNG.Datei, wenn Du einen Stream explizit als ".bmp" speichern willst, müsstest Du einen kleinen Umweg gehen.

Daher gehe ich davon aus, dass Deine Bitmap in Wahrheit als PNG-Datei gespeichert wird.

Die VCL.Bitmap kann aber kein PNG laden, Du könntest aber unter VCL mit Image.picture(.grafic) versuchen, ob die Datei als png geladen werden kann.

Geändert von Harry Stahl (29. Jun 2020 um 16:29 Uhr)
  Mit Zitat antworten Zitat
jangbu

Registriert seit: 6. Apr 2006
168 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 17:02
Hmm, welches Format wäre denn am sinnvollsten um Images als blob von FMX und VCL speichern und auslesen zu können.
Wie könnte ich denn das (image)blob-feld beim Auslesen aus der DB so wandeln, dass es VLC versteht?
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#5

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 17:14
Dann kann man mit Map/Unmap auf die Pixeldaten zugreifen.
Vielleicht ist hier was für dich dabei.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 17:53
Hmm, welches Format wäre denn am sinnvollsten um Images als blob von FMX und VCL speichern und auslesen zu können.
Wie könnte ich denn das (image)blob-feld beim Auslesen aus der DB so wandeln, dass es VLC versteht?
Wie gesagt, PNG wäre wohl am besten. Meinen Vorschlag schon probiert?
  Mit Zitat antworten Zitat
jangbu

Registriert seit: 6. Apr 2006
168 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 18:35
ja, so geht es jetzt! Danke!

Code:
png.create;
BlobStream.Position := 0;
png.LoadFromStream(BlobStream);
Image2.Picture.Graphic := png;
png.Free;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#8

AW: Image mit FMX in DB speichern und zurücklesen

  Alt 30. Jun 2020, 04:45
@Klugscheißer

1. try/finally vergessen?
2. Das steht mit Sicherheit in einem "with" Block...wegen unqualifizierten Namen. "with" ist "neuerdings " bäääh.
3. BlobStream.Position := 0; ist unnötig, da nach dem Create die Position eh auf 0 steht.

  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:58 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