Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi MySQL Blob als longblob Bild speichern und auslesen (https://www.delphipraxis.net/150273-mysql-blob-als-longblob-bild-speichern-und-auslesen.html)

hirsch 12. Apr 2010 10:33


MySQL Blob als longblob Bild speichern und auslesen
 
In einer Bilderdatenbank sollen Bilder als jpg gepeichert werden und wieder ausgelesen werden. Irgendwie habe ich das Gefühl, dass in der Datenbankspalte 'BlobBild' irgendetwas steht nur nicht das Bild.
[code=delphi]
Code:
procedure TAnzeige.FileListBox1Click(Sender: TObject);
begin
  Datei:=FileListBox1.FileName;
  Image1.Picture.LoadFromFile(FileListBox1.FileName); //<-das soll, wenn ich weiss wie es geht auf die Zelle der DB zeigen
  LblAnz.Caption:='Bild: ';
end;
gespeichert soll werden:
[code=delphi]
Code:
procedure TAnzeige.BuHinzuClick(Sender: TObject);
var Bild : TGraphic;
begin
  IDBild:=0;
  //HoleDatei;
  with Datamodule1.cds1 do begin
    last;
    IDBild:=FieldByname('ID').AsInteger;
    edit;
    append;
    FieldByName('ID').AsInteger:=IDBild+1;
    fieldbyName('Datei').AsString:=Datei;
    fieldbyname('BlobBild').AsVariant:=Bild; //<-das will er so nicht, asPicture oder so gibts nicht.
    Applyupdates(-1);
    Image1.Picture.LoadFromFile(Datamodule1.cds1.FieldByName('BlobBild').Value);
    LblAnz.Caption:='Bild: '+Datamodule1.cds1.FieldByName('Datei').AsString;
  end;
end;
Bis her war ich der Meinung dass man in Blob-Felder binäre Daten schreiben und lesen kann, oder irre ich mich da?
Danke für Antworten.

DeddyH 12. Apr 2010 10:43

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Du wirst einen kleinen Umweg über Streams gehen müssen. In den meisten Zugriffsbibliotheken gibt es einen TBLOBStream, schau doch mal, ob das bei Dir auch so ist.

hirsch 12. Apr 2010 11:39

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Aha, über Stream?
Wie geht das?
Also nur nochmal zur Erklärung:
Ich will den Inhalt eines Blobfeldes in 'Bild' speichern.
Später möchte ich 'Bild' wieder in das Blobfeld speichern.

Hab noch nie was mit Stream gemacht.
Ich suche mal in den Tutos, vielleicht finde ich ja was..... :wiejetzt:
Danke erstmal.

Bernhard Geyer 12. Apr 2010 12:17

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Das Stichwort wurde schon genannt: Hier im Forum suchenTBLOBStream

Dort gibt es für jeden Zugriffsweg (BDE/ADO/native/dbExpress) Beispielcode der Verwendung.

hirsch 12. Apr 2010 13:41

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Vielen Dank
Welches USES fehlt mir noch?
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, StdCtrls, ExtCtrls, DBCtrls, DB, Grids, DBGrids, ToolWin, ComCtrls,
  ExtDlgs, FileCtrl, Menus, Mask;
weil bei
Delphi-Quellcode:
procedure TAnzeige.BuHinzuClick(Sender: TObject);
var Bild : TGraphic;
    BS: TBlobStream; //<--Ärger

begin
will er TBlobstream nicht wissen. Ich arbeite mit den dbExpress-Geschichten...

DeddyH 12. Apr 2010 13:46

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Versuch es mit DBTables.

hirsch 12. Apr 2010 14:45

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Danke DeddyH. das klappt soweit.
Nun bekomme ich immer, nachdem ich gesucht habe, immer den Fehler"Ungültige Typenumwandlung".
Der Code sieht so aus:
Delphi-Quellcode:
procedure TAnzeige.BuHinzuClick(Sender: TObject);
var Bild : TPicture;
    BS: TBlobStream;
    jpg: TJPEGImage;
begin
  IDBild:=0;
  //HoleDatei;
  try
  BS := TBlobstream.create(Datamodule1.cds1.FieldByName( 'BlobBild' )AS TBlobField, bmWrite ); //<-Genau immer Hier
    with Datamodule1.cds1 do begin
      last;
      IDBild:=FieldByname('ID').AsInteger;
      edit;
      append;
      FieldByName('ID').AsInteger:=IDBild+1;
      fieldbyName('Datei').AsString:=Datei;
      Applyupdates(-1);
    end;
    jpg := TJPEGImage.Create;
    jpg.LoadFromStream(bs);
    Image1.Picture.Assign(jpg);
    LblAnz.Caption:='Bild: '+Datamodule1.cds1.FieldByName('Datei').AsString;
  finally
    BS.free;
  end;
end;

DeddyH 12. Apr 2010 15:11

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Ich würde es mit der Hier im Forum suchenCreateBlobStream-Methode von TDataset versuchen.

Bebe 12. Apr 2010 15:46

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Hallo,

Bild in DB speichern geht so.

Delphi-Quellcode:
procedure TfrmAddImages.btnSaveImagesToDBClick(Sender: TObject);
var
  fstream: TMemoryStream;
begin
  fstream := TMemoryStream.Create;
  tblImage.Append;
  fstream.LoadFromFile('C:\Test.png');
  fstream.Position := 0;
  tblImagepng32.LoadFromStream(fstream);
  tblImage.Post;
  fstream.Free;
end;
// (Inhalte gekürzt, ich hoffe ich habe nicht zuviel gelöscht.)
Das Feld tblImagepng32 ist vom Typ TBlobField

Der Ladevorgang ist ebenso einfach, du mußt es nur umstellen. Nie das fstream.Position := 0 vergessen, eine häufige Fehlerquelle. Damit wird nur die Position innerhalb des Stream zurückgesetzt, die nach dem Befehl fstream.LoadFromFile('C:\Test.png') auf der letzten steht. Denn bei tblImagepng32.LoadFromStream(fstream); willst du ja den gesamten Stream lesen.

Ich hoffe ich konnte dir helfen.

Gruß
Matze

hirsch 13. Apr 2010 14:45

Re: MySQL Blob als longblob Bild speichern und auslesen
 
Ok, Danke Bebe,
das funktioniert. Hab dann eine SQL-Datensicherung gemacht und mir angeguckt, was in dem BLOB steht, und es ist wirklich das Bild.

Ach ja ich sollte noch erwähnen, dass in der Tabelle nur jpg vorkommen können.
Nun habe ich angefangen das BlobFeld auszulesen und in ein TImage anzuzeigen. und da bekomme ich immer den Fehler JPEG #41. Dann habe ich hier gesucht und nix gefunden, nur das habe ich gefunden, was ich eh schon gemacht habe.
Delphi-Quellcode:
var sql  : String;
    BS   : TClientBlobStream;
    blobF : TBlobField;
    MS   : TMemorystream;
    jpg  : TJPEGImage;
...//.. Schnipp
      //Bild anzeigen
      bS.Position:=(JpegStartsInBlob(Datamodule1.cds1.FieldByName('Blobbild') as TBlobField));
      Try
        bS.Seek(JpegStartsInBlob(Datamodule1.cds1.FieldByName('Blobbild') as TBlobField), soFromBeginning);
        MS := TMemoryStream.Create;
        MS.CopyFrom(BS, BS.Size);
        MS.Position := BS.Position;
        jpg:=TJPEGImage.Create;
        //JPEGtoBMP(bs);
        jpg.LoadFromStream(bs);
        Image1.Picture.Graphic:=jpg;                 //habe das probiert
        Image1.Picture.Graphic.LoadFromStream(ms);   //und das auch, und habe beides probiert.
      Finally
         ms.Free;
      End;
Das sind so die Ergebnisse die ich bei der Suche gefunden habe.
Was mache ich hier falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr.
Seite 1 von 2  1 2      

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