Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi JPg aus DB laden und in TImage anzeigen (https://www.delphipraxis.net/74867-jpg-aus-db-laden-und-timage-anzeigen.html)

Lemmi 9. Aug 2006 21:07

Datenbank: mysql • Version: 4xx • Zugriff über: zeos

JPg aus DB laden und in TImage anzeigen
 
Hi, ich möchte ein bild in einer tabelle speichern und dann in ein TImage laden.

Delphi-Quellcode:
// Speichern
               jpg:=TJPEGImage.Create;
                m:=TMemoryStream.Create;
                try
                jpg.Assign(img_main_logo.Picture.Graphic);

                jpg.SaveToStream(m);
                m.Position := 0;
                TBlobField(aqTmp.FieldByName('pfad')).LoadFromStream(m);
                finally
                    FreeAndNil(m);
                    FreeAndNil(jpg);
                end;

// Laden
                jpg:=TJPEGImage.Create;
                m:=TMemoryStream.Create;
                try
                    TBlobField(aqTmp.FieldByName('pfad')).SaveToStream(m);
                    m.Position:=0;
                    jpg.LoadFromStream(m);
                    img_main_logo.Picture.Assign(jpg);
                finally
                    FreeAndNil(m);
                    FreeAndNil(jpg);
                end;
Diesen Code fand ich in einem Älteren Thread, wurde aber nicht wirklich schlau daraus...

Das Speichern klappt, Problem ist halt, nachdem die Zeile:
Delphi-Quellcode:
img_main_logo.Picture.Assign(jpg);
ausgeführt wird, erhalte ich eine Fehlermeldung: Premature end of JPEG File

Hab mir schon nen wolf gesucht, leider nix dergleichen gefunden...muss doch irgendwie möglich sein :?

Bin für jede Hilfe Dankbar

Achso, in der Tabelle hab ich natürlich?! ein Blob-Feld genommen

kluckweb 9. Aug 2006 21:57

Re: JPg aus DB laden und in TImage anzeigen
 
Hi,

hier ein Code mit dem es auf jeden Fall funktioniert:

Delphi-Quellcode:

var
jpg:TJPEGImage;
m:TMemoryStream;
begin
  jpg:=TJPEGImage.Create;
  m:=TMemoryStream.Create;
 if (Datenbank.FieldByName('foto') As TBlobField).BlobSize > 0 then

  try
    TBlobField(Datenbank.FieldByName('foto')).SaveToStream(m);
    m.Position:=0;
    jpg.LoadFromStream(m);
    Image1.Picture.Assign(jpg);
  finally
    FreeAndNil(m);
    FreeAndNil(jpg);
 Image1.Visible := True; end
  else Image1.Visible := False;

end;

Damit kannst Du auf jeden Fall ein Bild aus einer Datenbank in einem Image anzeigen lassen.
Hoffe, dass es Dir hilft.

Viel Erfolg

Lemmi 10. Aug 2006 14:58

Re: JPg aus DB laden und in TImage anzeigen
 
Re,

Leider nicht, erhalte wieder die gleiche fehlermeldung. Wenn du sagst, dass der Code auf jedenfall funktioniert, kann es ja nur an dem Code liegen, mitdem ich es inne Db reinpacke?! Dafür verwende ich folgenden Code :

Delphi-Quellcode:
Procedure Bild2DB(id:integer);
var blob : TMemoryStream;
    jpeg : TJPEGImage;
Begin
  blob := TMemoryStream.Create();
  jpeg := TJPEGImage.Create(form1);
  TRY
    if Form1.OPD.Execute then
    begin
      jpeg.LoadFromFile(Form1.OPD.FileName);
      blob.Clear;
      jpeg.SaveToStream(blob);
    end;
    Form1.Query.SQL.Text := 'Update filme Set bild = :bild where ID = :id';
    Form1.Query.ParamByName('bild').LoadFromStream(blob,ftgraphic);
    Form1.Query.ParamByName('id').AsInteger := id;
    Form1.Query.ExecSQL;
  Finally
    jpeg.LoadFromStream(blob);
  END;
  blob.Free;
  jpeg.Free;
end;
Muss man da irgendwie prüfen obs komplett übertragen wurde oderso? Noch dazu gesagt, ich benutze Delphi7, vielleicht liegts ja auch an meiner JPeg-Unit??

marabu 10. Aug 2006 15:07

Re: JPg aus DB laden und in TImage anzeigen
 
Hallo Lemmi,

zwischen SaveToStream() und LoadFromStream() solltest du die Position des Streams auf 0 zurücksetzen, damit auch wirklich etwas in die Datenbank geschrieben werden kann.

Grüße vom marabu

Lemmi 10. Aug 2006 17:10

Re: JPg aus DB laden und in TImage anzeigen
 
Ich bin dem Fehler auf der Schliche :???:

Habe herausgefunden, dass ein blob-feld maximal 64kb aufnehmen kann, ein longblob hingegen 16mb.

Nimmt man ein Longblob-Feld, funktioniert der oben angegebene code, bis auf die Sache: TJPEGImage kann Image1.Picture nicht zugewiesen werden.

Wenn man nun größere Streams speichern möchte, bei mir ist es ein 700kb großes Bild, erhält man eine Fehlermeldung, dass das Packet zu groß sei. Dazu muss man den MySQL-Wert : Max_allowed_packet ändern, z.B. auf 16m(16mb). Weiß aber nur nich wo ich den finde...

Somit ist das hauptsächliche Problem gelöst, Vielen Dank für eure Hilfestellungen. Scheut euch nicht vor Pn'S bezüglcih diesen Themas ;)

marabu 10. Aug 2006 17:26

Re: JPg aus DB laden und in TImage anzeigen
 
Der Spaltentyp BLOB kann nur 64K speichern. Wenn deine Images größer sind musst du natürlich einen passenderen Spaltentyp wählen. Vielleicht schaust du mal in die Dokumentation? Trial-and-Error kann ganz schön ermüdend sein.

Freundliche Grüße vom marabu


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