Entwickler-Ecke

Datenbanken - jpg in einer Datenbank


vamp79 - Mi 08.01.03 01:57
Titel: jpg in einer Datenbank
Hallo und einen schönen guten abend,

ich hab folgendes Problem. ich habe mir ein kleines Programm geschrieben (oder besser ich versuche es). In der Datenbank des Programms soll zu jeden Datensatz bei bedarf ein bild hinzugefügt werden.

ich hab es versucht mit einer Paradox Datenbank, einem DBImage und einem OpenPictureDialog. aber irgendwie funktioniert das nicht.

das prog. soll in etwa so funktionieren. man klickt auf einen Button, dann öffnet sich der OpenPictureDialog, dann sucht man sich ein JPG von der platte aus und dieses ausgewählte JPG soll dann im DBImage angezeigt werden. außerdem soll der Pfad des Bildes in der Datenbank gespeichert werden.

Vor allem ist es wichtig das die bilder im JPF Format bleiben. ich bekomm dann allerdings immer die fehlermeldung:
Zitat:
Bitmap image is not valid.

Kann mir jemad helfen, ich hab schon im Forum und im internet gesucht aber ich hab nichts passendes gefunden.

So lautet mein quellcode

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
unit Unit1;

interface

uses
  Jpeg, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DBCtrls, StdCtrls, Mask, DB, DBTables, ExtDlgs;

type
  TForm1 = class(TForm)
    DBEdit1: TDBEdit;
    Button1: TButton;
    DBImage1: TDBImage;
    DBNavigator1: TDBNavigator;
    DataSource1: TDataSource;
    Table1: TTable;
    OpenPictureDialog1: TOpenPictureDialog;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure DBImage1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.DBImage1Click(Sender: TObject);
begin
DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
If OpenPictureDialog1.Execute then Begin

Table1.Edit;
Table1.FieldbyName('Bild').AsString:=OpenPictureDialog1.Filename;
Table1.Post;
End;

end;

end.


Ach so... ich bin anfänger, wäre also für eineeinfach aber genaue Antwort sehr sehr dankbar.

Gruß
Vamp79


UGrohne - Mi 08.01.03 02:56

Wenn ichs richtig weiß, nimmt DBImage nur Bitmaps auf, Du musst also Dein JPG in ein BMP umwandeln, anders geht es nicht.

Hier hab ich einen Code, der ein JPG in BMP umwandelt und dieses in einem bestimmten Pfad speichert. Ich denke, Du kannst es soweit erweitern, dass ein anderer Pfad genommen werden kann:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure Tform1.JPEGtoBMP(FileName : string);
var jpeg : TJPEGImage; 
    bmp : TBitmap; 
begin 
     jpeg:= TJPEGImage.Create; 
     try 
        jpeg.LoadFromFile(FileName ); 
        jpeg.CompressionQuality := 100; {Normaler Wert, kann weggelassen werden} 
        bmp:= TBitmap.Create; 
        try 
            bmp.Assign(jpeg);
            ForceDirectories(ExtractFilePath(Application.ExeName)+'graphics');
            bmp.SaveTofile(ExtractFilePath(Application.ExeName)+'graphics\logo.bmp');
        finally
               bmp.free
        end;
     finally 
            jpeg.free 
    end;


Ach, jetzt les ich deinen Beitrag nochmal, da stimmt was nicht. Ich lass das oben aber mal, vll. kannstes doch brauchen. DBImage zeigt aus BLOB-Feldern (Binary Large Object) der Datenbank Bilder an. Wenn Du aber den Pfad speichern willst, dann tust Du das auch, dann brauchste aber in der DB ein String-Feld und speicherst dort Deinen Pfad. Das Bild zeigst Du dann aber in einer TImage-Komponente an, ist halt die Frage, ob das dann JPG unterstützt, deswegen der obige Code. Musste einfach mal rumprobieren.

Gruß


vamp79 - Mi 08.01.03 09:29

Versteh ich das richtig???

Der Pfad des Bildes, was ich über den "OpenPictureDialog" ausgewählt habe wird in der Datenbank in ein stringfeld gespeichert.
dann benutze ich ein TImage-Komponente die auf das stringfeld zugreift und dann das bild anzeigt? :?: :?: :?:

wie erstelle ich in der db eine string feld oder besser was ist ein stringfeld?
und wie verknüpfe ich die TImage-Komponente mit dem Stringfeld.

muß ich sonst noch was beachten??

vielen dank

vamp79


hansa - Mi 08.01.03 10:14

Hi,

durch Zufall habe ich gestern ein kleines Bilder-Programm gemacht und hierbei festgestellt, daß bei TImage das Bild selber in der DFM-Datei steht ! In einer DB würde ich es als Blob-Feld speichern, sofern das mit Paradox überhaupt geht. Werde das mal mit Interbase ausprobieren.

Gruß
Hansa


hansa - Mi 08.01.03 10:18

Wußte doch, daß da was war !

http://www.delphipraxis.net/viewtopic.php?t=1336&highlight=blobfeld

Les Dir das mal durch. Da scheint einer ähnliche Probleme zu haben.

Gruß
Hansa

P.S.: Sehe gerade, das bringt Dir nicht viel, der Frage-Steller war damals wenig kooperativ. :autsch: Suche lieber mal hier !


LCS - Mi 08.01.03 10:25

Hi
vamp79 hat folgendes geschrieben:
Der Pfad des Bildes, was ich über den "OpenPictureDialog" ausgewählt habe wird in der Datenbank in ein stringfeld gespeichert.
dann benutze ich ein TImage-Komponente die auf das stringfeld zugreift und dann das bild anzeigt? :?: :?: :?:

Ich würde dein erstes Posting auch so interpretieren.

vamp79 hat folgendes geschrieben:

wie erstelle ich in der db eine string feld oder besser was ist ein stringfeld?
und wie verknüpfe ich die TImage-Komponente mit dem Stringfeld.

Na wie wär's wenn du das gleiche Programm benutzt, mit dem duch auch die Tabelle erzeugt und das Bildfeld hineingezaubert hast? :wink: Stichwort Datenbankoberfläche. Ein Stringfeld ist ein Feld das einen String, eine Zeichenkette speichert. Also ein ganz banales Textfeld. Mit dem Code, den du unter Button2Click stehen hast, füllst du es mit dem Pfad des Bildes.

vamp79 hat folgendes geschrieben:

muß ich sonst noch was beachten??

Ja, das Textfeld in der Datenbank muss natürlich gross genug sein, um den Pfad aufnehmen zu können. Und wenn du durch die Daten blätterst, muss das Bild auf deinem Formular aktualisiert werden. Das könntest du im AfterScroll Ereignis deiner Tabelle machen. Etwa so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  image1.picture := nil;
  if  not table1.FieldByName('Pfad').IsNull  then
      if  FileExists(table1.FieldByName('Pfad').AsString) then
          image1.Picture.LoadFromFile(table1.FieldByName('Pfad').AsString);
end;


Gruss Lothar


hansa - Mi 08.01.03 14:18

Hi,

jetzt bin ich hier am grübeln. Bevor ich falsch anfange : Was ist denn nun eigentlich besser, nur den Pfad auf das Bild in der DB zu speichern, oder macht es nichts aus, das Bild selbst als Blob zu speichern? Grübel, grübel und studier.... Oder bin ich da sowieso verkehrt :?:

Gruß
Hansa


vamp79 - Mi 08.01.03 18:14

Alles klar jetzt funtioniert es :D , das der Pfad des JPG-Bildes in der Datenbank gespeichert
wird, aber wie bekomm ich es hin das das bild mir auch im TImage angezeigt wird?? :?:
ich muß ja warscheinlich irgendwie dad timage mit der datenbank verbinden

vielen dank

vamp79


LCS - Do 09.01.03 09:51

Hi
vamp79 hat folgendes geschrieben:
Alles klar jetzt funtioniert es :D , das der Pfad des JPG-Bildes in der Datenbank gespeichert
wird, aber wie bekomm ich es hin das das bild mir auch im TImage angezeigt wird?? :?:
ich muß ja warscheinlich irgendwie dad timage mit der datenbank verbinden

Steht in meiner Antwort ein Stück weiter oben.

Gruss Lothar