Avatar billede perdb Nybegynder
12. oktober 2001 - 10:45 Der er 32 kommentarer og
2 løsninger

Gemme et bmp billede eller jpeg i BLOB felt ?

Jeg mangler delphikode/SQL syntaks til ovenstående

min tabel ser ud på følgende måde:

PicId  PicBlob

NB! kun point til kode
Avatar billede martinlind Nybegynder
12. oktober 2001 - 11:13 #1
VAR
  B : TBlobStream;

begin
  B := MyQuery.CreateBlobStream(MyQuery.FieldByName(\'PicBlob\'),bmReadWrite);
  // Du kan så stream til B
  // det skulle være det der skal til
  // har du problemer kan du kigge i hjælpen
  // under Blobstream
end;

/Martin
Avatar billede perdb Nybegynder
12. oktober 2001 - 11:22 #2
og hvordan ser min SQL streng så ud ?


querry1.sql.add(insert picid, picblob ????
Avatar billede perdb Nybegynder
12. oktober 2001 - 11:28 #3
Jeg går ud fra at
B := MyQuery.CreateBlobStream(MyQuery.FieldByName(\'PicBlob\'),bmReadWrite);

henter i databasen, men det er jo lidt hønen og ægget, først må billedet derned

og hvordan viser jeg så billedet i et image ?

jeg har sat lidt ekstra point på spil til den som kan løse problemet

Avatar billede perdb Nybegynder
12. oktober 2001 - 11:30 #4
B := MyQuery.CreateBlobStream(MyQuery.FieldByName(\'PicBlob\'),bmReadWrite);

giver compiler fejl incompatible typer TBlopStream og TStream ???
Avatar billede martinlind Nybegynder
12. oktober 2001 - 11:36 #5
sorry, du skal nok bruge Parametre

VAR
  B : TMemoryStream;

begin
  B := TMemoryStream.Create;
  Bitmap.SaveToStream(B);
  querry1.sql.add(\'insert into :picid, :picblob \');
  querry1.Params.ParamByName(\'picblob\').AsBlob := B.Memory^

eller :

VAR
  B : TStringStream;

begin
  B := TStringStream.Create(\'\');
  Bitmap.SaveToStream(B);
  querry1.sql.add(\'insert into :picid, :picblob \');
  querry1.Params.ParamByName(\'picblob\').AsBlob := PChar(B.DataString);

Bare et par uprøvede ider


Avatar billede martinlind Nybegynder
12. oktober 2001 - 11:39 #6
Første eks. kan du bruge til at hente billedet ind Image.LoadFromStream(B), du laver bare en alm TStream i stedet for en Blobstream, og så kan du prøve det andet eks. til at gemme dem
Avatar billede martinlind Nybegynder
12. oktober 2001 - 11:53 #7
evt. :

querry1.Params.ParamByName(\'picblob\').SetBlobData(B.DataString,B.Size);

/Martin
Avatar billede martinlind Nybegynder
12. oktober 2001 - 11:54 #8
Kan du ikke få det til at funke, kan jeg godt prøve at kigge på det med har ikke tid før i aften
Avatar billede perdb Nybegynder
12. oktober 2001 - 11:57 #9
Jeg prøver og hvis ikke så vender jeg tilbage
Avatar billede martinlind Nybegynder
12. oktober 2001 - 11:58 #10
Ok
Avatar billede perdb Nybegynder
12. oktober 2001 - 12:13 #11
Nej det lykkedes ikke rigtigt

Bitmap.SaveToStream(B);

Kan ikke compileres ?

Hvis du vil se på det i aften, så er min privatmail:

perdb@ofir.dk

Opgaven i sin helhed går ud på at indlæse et grafikbillede af typen BMP, JPEG, JPG, WMF,EMF
fra HardDisken(Button1) eller fra databasen (button2) vise det i et TImage.

Det viste billede skal hvis det er indlæst fra Harddisken kunne gemmes i en SQL database (via BDE), og jeg tænker det er bedst at gemme som JPEG aht. at spare på pladsen i DB\'en

Der er 500 point (dette spg, + spg under til den som løser opgaven)




Avatar billede martinlind Nybegynder
12. oktober 2001 - 12:20 #12
Ok, Jeg kigger på det i aften :)
Avatar billede perdb Nybegynder
12. oktober 2001 - 12:27 #13
Der er 500 point til den som finder en løsning ;)
Avatar billede martinlind Nybegynder
12. oktober 2001 - 12:48 #14
Check din Mail !!

/Martin
Avatar billede martinlind Nybegynder
12. oktober 2001 - 12:54 #15
Pas filen :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, Grids, DBGrids, DBTables, StdCtrls, ExtCtrls, ExtDlgs, JPeg;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Query1: TQuery;
    Query2: TQuery;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Image2: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure DataSource1DataChange(Sender: TObject; Field: TField);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
      Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
VAR
  Jpg : TJpegImage;
  S : TMemoryStream;
begin
  Jpg := TJpegImage.Create;
  Jpg.Assign(Image1.Picture.Bitmap);
  S := TMemoryStream.Create;
  Jpg.SaveToStream(S);
  Jpg.Free;
  Query1.SQL.Text := \'INSERT INTO PICS ( PicID, Pic ) VALUES( :PicID, :Pic )\';
  Query1.Prepare;
  Query1.Params.ParamByName(\'PicID\').AsInteger := 1;
  Query1.Params.ParamByName(\'Pic\').SetBlobData(S.Memory,S.Size);
  Query1.ExecSQL;
  S.Free;
  Query2.Close;
  Query2.Open;
end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
VAR
  S : TStream;
  Jpg : TJpegImage;
begin
  Jpg := TJpegImage.Create;
  S := Query2.CreateBlobStream(Query2.FieldByName(\'Pic\'),bmRead);
  Jpg.LoadFromStream(S);
  Image2.Picture.Bitmap.Assign(Jpg);
  S.Free;
  Jpg.Free;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Query2.Open;
end;

end.

DFM filen :

object Form1: TForm1
  Left = 330
  Top = 107
  Width = 514
  Height = 522
  Caption = \'Form1\'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = \'MS Sans Serif\'
  Font.Style = []
  OldCreateOrder = False
  OnActivate = FormActivate
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 20
    Top = 25
    Width = 105
    Height = 105
  end
  object Image2: TImage
    Left = 370
    Top = 30
    Width = 105
    Height = 105
  end
  object Button1: TButton
    Left = 150
    Top = 25
    Width = 75
    Height = 25
    Caption = \'Læs fra disk\'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 150
    Top = 60
    Width = 75
    Height = 25
    Caption = \'Gem i table\'
    TabOrder = 1
    OnClick = Button2Click
  end
  object DBGrid1: TDBGrid
    Left = 20
    Top = 145
    Width = 461
    Height = 326
    DataSource = DataSource1
    TabOrder = 2
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = \'MS Sans Serif\'
    TitleFont.Style = []
  end
  object Query1: TQuery
    DatabaseName = \'BMP_SQL\'
    Left = 145
    Top = 100
  end
  object Query2: TQuery
    DatabaseName = \'BMP_SQL\'
    SQL.Strings = (
      \'SELECT PicID, Pic\'
      \'FROM \"Pics.DB\" Pics\')
    Left = 100
    Top = 180
  end
  object DataSource1: TDataSource
    DataSet = Query2
    OnDataChange = DataSource1DataChange
    Left = 140
    Top = 180
  end
  object OpenPictureDialog1: TOpenPictureDialog
    Left = 70
    Top = 5
  end
end

/Martin
Avatar billede martinlind Nybegynder
15. oktober 2001 - 10:15 #16
PerDB, sker der noget ????
Avatar billede perdb Nybegynder
15. oktober 2001 - 14:43 #17
Hej Martin

Allerførst, tak for dit eksempel det ser ud til at løse de fleste af mine problemer.

Der er dog lige et par småting

1. Posten eksistere allerede i min db når billedet ligges ind, så det er vel nærmest en update jeg skal bruge, jeg har prøvet at bytte lidt rundt på syntaksen uden held, måske du har et hint til det rigtige SQL kald.

2. Med ovenstående kode kan jeg håndtere BMP, og med lidt tilretninger JPEG, men hvad med wmf og emf ?

3. Er der nogen måde at teste på hvilket format et billede har ud over at kigge på filextension ?

4. Hører måske ikke lige til dette spg. men anyway hvordan læser jeg dato og tid på en fil

Håber du kan hjælpe med noget af ovenstående

/Per
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:51 #18
1. UPDATE <DB> WHERE ID = :ID SET BLOB = :BLOB

2. Du kan prøve om du kan finde en Comp. der kan håndtere de formater, det er nok det nemeste

3. Nej det tror jeg ikke, ext. er nok det nemeste og hurtigste.

4. FindFirst() retunere en SearchRec hvor der er en Time

/Martin
Avatar billede perdb Nybegynder
15. oktober 2001 - 16:43 #19
Kan du ikke uddybe 4. lidt mere, hvis jeg har en streng jeg gerne vil have dat og tid over i ?

var
  FilPath, FilDato, FilTid : String;
begin
  FilPath := \'C:\\MinFil.fil\';
  FilDato :=
  FilTid :=

  end;
Avatar billede martinlind Nybegynder
15. oktober 2001 - 16:58 #20
VAR
  S : TSearchRec;
  aDato : String;
begin
  if FindFirst(\'\',faANYFILE,S) then
  begin
      aDato := DateTimeToStr(FileDateToDateTime(S.Time));
  end;
  FindClose(S);

end;

/Martin
Avatar billede perdb Nybegynder
15. oktober 2001 - 17:09 #21
1. Jamen skal jeg ikke angivet path og filnavn til den fil der skal testes på ?

2. Den vil i øvrigt altid ligge i det bibliotek som mit program startes fra, er der en kommando til at spørge på stien til programstart ?
Avatar billede martinlind Nybegynder
15. oktober 2001 - 17:11 #22
Jo Sorry, FindFirst(\'C:\\Mypic.bmp\',faANYFILE,S)
Avatar billede martinlind Nybegynder
15. oktober 2001 - 17:12 #23
ExtractFilePath(Application.exename);
Avatar billede perdb Nybegynder
16. oktober 2001 - 12:43 #24
Hej Martin

Jeg har arbejdet lidt med det igår aftes desværre virker det ikke endnu, min kode ser sådan her ud:

procedure TtpDlg.SpeedButton1Click(Sender: TObject);
var
Jpg : TJpegImage;
  S : TMemoryStream;
if OpenPictureDialog1.Execute then
  begin
    LEditBgPic.Text := OpenPictureDialogInt.FileName;
    if FileExists(LEditBgPic.Text) then
    begin
      ImageBgPic.Picture := nil;
      ImageBgPic.Picture.LoadFromFile(LEditBgPic.Text);
      ImageBgPic.Stretch := True;
      Jpg := TJpegImage.Create;
      Jpg.Assign(ImageBgPic.Picture.Bitmap);
      S := TMemoryStream.Create;
      Jpg.SaveToStream(S);
      Jpg.Free;
      Query1.SQL.Clear;
      Query1.SQL.Text := \'UPDATE MyPicTable WHERE ID = \'+IntToStr(IdSelectedPic)+ \'SET Pic = :Pic\';
      Query1.Prepare; //<-------HER GÅR DET GALT
      Query1.Params.ParamByName(\'Pic\').SetBlobData(S.Memory,S.Size);
      Query1.ExecSQL;
      S.Free;
    end
    else
      ImageBgPic.Picture := nil;
  end;
end;

Det er på denne linie der er problemer

Query1.Prepare;

Ved RunTime får jeg fejlen no SQL staement avaliabel
Avatar billede martinlind Nybegynder
16. oktober 2001 - 12:55 #25
en lille \"bøf\"

prøv sådan her :

Query1.SQL.Text := \'UPDATE MyPicTable SET Pic = :Pic WHERE ID = \'+IntToStr(IdSelectedPic);

/Martin
Avatar billede perdb Nybegynder
16. oktober 2001 - 13:15 #26
Det gør ingen forskel

Query1.Prepare;

giver ovenstående fejl, kan det skyldes at der ikke er angivet noget SQL statement som default for Query1 (i property SQL object inspector)

og hvis det kan hvordan skal det så se ud ?

har prøvet sådan her SELECT * FROM MyPicTable

så skifter fejlen til: can not perform this kind of operation on a open dataset, men jeg har da lige brugt Query1.close
Avatar billede perdb Nybegynder
16. oktober 2001 - 13:19 #27

Query1.Close; >- HER HAR JEG INDSAT CLOSE
Query1.SQL.Clear;
      Query1.SQL.Text := \'UPDATE MyPicTable WHERE ID = \'+IntToStr(IdSelectedPic)+ \'SET Pic = :Pic\';
      Query1.Prepare; //<-------HER GÅR DET GALT
      Query1.Params.ParamByName(\'Pic\').SetBlobData(S.Memory,S.Size);
      Query1.ExecSQL;
     
Avatar billede perdb Nybegynder
16. oktober 2001 - 13:24 #28
Har lige prøvet følgend (med en Add istedet)

Query1.Close; >- HER HAR JEG INDSAT CLOSE
Query1.SQL.Clear;
      Query1.SQL.Add( \'UPDATE MyPicTable WHERE ID = \'+IntToStr(IdSelectedPic)+ \'SET Pic = :BgPic\');
      Query1.Prepare; //<-------HER GÅR DET GALT
      Query1.Params.ParamByName(\'BgPic\').SetBlobData(S.Memory,S.Size);
      Query1.ExecSQL;
   

Giver fejlen Query1 : Parameter BgPic not found 
Avatar billede perdb Nybegynder
16. oktober 2001 - 13:32 #29
Måske det oprindelige eksempel kunne udvides med en update facilitet ?
Avatar billede martinlind Nybegynder
16. oktober 2001 - 13:36 #30
Først skal du ihvert fald ændre dit statement til det jeg skrev WHERE skal stå til sidst, jeg har lige checket dette på den table jeg sendte til dig det kørte uden fejl :

\'UPDATE PICS SET PIC = :PIC WHERE PICID = 1\'

/Martin
Avatar billede perdb Nybegynder
16. oktober 2001 - 13:51 #31
Jeg prøver at se på det i aften
Avatar billede martinlind Nybegynder
16. oktober 2001 - 13:53 #32
Ok
Avatar billede perdb Nybegynder
28. oktober 2001 - 18:08 #33
Ja så virker det med db\'en = 250 point.

de forskellige billedtyper blev ikke løst = 250
Avatar billede martinlind Nybegynder
28. oktober 2001 - 23:10 #34
Du kan lave en EMF med TMetaCanvas.Create og så Draw\'e frem og tilbage til en Bitmap
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester