Bazy Danych

0

Witam wszystkich.

Czy może ktoś wie, czy bazy Paradoxa można zmusić do przechowywania obrazków w formacie JPG, bo BMP chodzą prawidłowo, ale rozmiar bazy strasznie szybkoo rośnie :-8

0

W bazach Paradox, i nie tylko, można przechowywać dowolne dane.
Do zapisywania i odczytu "niestandardowych" typów danych do/z bazy można wykorzystać specjalne pola BLOB (Binary Large Object). Odczyt i zapis do pól tego typu odbywa się za pomocą strumieni.

0

W bazach Paradox, i nie tylko, można przechowywać dowolne dane.
Do zapisywania i odczytu "niestandardowych" typów danych do/z bazy można wykorzystać specjalne pola BLOB (Binary Large Object). Odczyt i zapis do pól tego typu odbywa się za pomocą strumieni.

Ok.
Mam przykładowo dwa pola

nazwa = alphanumeric
zdjecie = Graphics

w DBImage załadowany JPG i jak to teraz zapisać do bazy [???]

0

Jeśli udało Ci się załadować JPG do DBImage-a, to wystarczy tylko:

procedure TFormMain.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  Table1.Append;
  ms := TMemoryStream.Create;
  try
    DBImage1.Picture.Graphic.SaveToStream(ms);
    with Table1 do
    begin
      Fields[0].AsString := 'jakiś tam tekst';
      (Fields[1] as TGraphicField).LoadFromStream(ms);
    end;
    Table1.Post;
  finally
    ms.Free;
  end;
end;
0

Jeśli udało Ci się załadować JPG do DBImage-a, to wystarczy tylko:

procedure TFormMain.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  Table1.Append;
  ms := TMemoryStream.Create;
  try
    DBImage1.Picture.Graphic.SaveToStream(ms);
    with Table1 do
    begin
      Fields[0].AsString := 'jakiś tam tekst';
      (Fields[1] as TGraphicField).LoadFromStream(ms);
    end;
    Table1.Post;
  finally
    ms.Free;
  end;
end;

I po wykonaniu tej procedury jest niby wszystko ok, ale za cholere nie mogę powiązać DBimage z polem 'zdjecie' bo cały czas wywala "Bitmap Image Is Not Valid'

0

Dzieję się tak dlatego, ponieważ DBImage akceptuje tylko bitmapy i (chyba) WMF,EMF,ICO.
(Ciekawe w jaki sposób zmusiłeś DBImage-a do wyświetlenia JPG-a ??)

Dodatkowym problemem jest to, że przy zmianie bieżącego rekordu, do DBImage-a będą automatycznie ładowane dane z pola ZDJECIE (czyli JPG) i wówczas DBImage głupieje. Można by wychwycić ten moment i odpowiednio zareagować, ale...

Najlepiej chyba zrezygnować z DBImage-a i zastosować np. TImage.
Przy zmianie rekordu przez użytkownika należałoby wówczas wczytać do strumienia dane z pola ZDJECIE, przekonwertować to na bitmapę i wyświetlić ją w TImage.
Natomiast, przy zmianie TImage-a przez użytkownika (np. użytkownik otwiera jakiś plik JPG za pomocą OpenDialog), należałoby wczytać ten plik JPG do strumienia i taki strumień zapisać do bazy. Następnie, przekonwertować ten plik (czy strumień) na bitmapę i wynik załadować do TImage-a.

Pisałeś też coś o rozmiarze bazy...
Jeśli zrezygnujesz z automatycznego pobierania/zapisywania danych z/do bazy, to przecież można zastosować kompresję (np. ZLIB) i w bazie zapisywać skompresowane JPG-i.

0

Więc np. Ja to robię tak. Korzystam ze standardowego komponentu delphi jakim jest open picture dialog. W metodzie oncanclose kod wygląda następująco :

dbimage.picture.loadfromfile(openpicturedialog.filename)

Oczywiście trzeba nadmienić, iż w sekcji uses dodałem bibliotekę JPEG i wszystko hula. Skoro dbimage wyświetla obrazek to myślę, że nie ma co kombinować z Timage skoro obrazki są potrzebne do współpracy z bazą. [hurra]

0

(Ciekawe w jaki sposób zmusiłeś DBImage-a do wyświetlenia JPG-a ??)

  JPG := TJPEGImage.Create;
  JPG.LoadFromFile('cos.jpg');
  DBImage1.Picture.Assign(JPG);   [hurra] 

do queue

Więc np. Ja to robię tak. Korzystam ze standardowego komponentu delphi jakim jest open picture dialog. W metodzie oncanclose kod wygląda następująco :

dbimage.picture.loadfromfile(openpicturedialog.filename)

Oczywiście trzeba nadmienić, iż w sekcji uses dodałem bibliotekę JPEG i wszystko hula. Skoro dbimage wyświetla obrazek to myślę, że nie ma co kombinować z Timage skoro obrazki są potrzebne do współpracy z bazą.

Chyba za bardzo nie przeczytałeś o co chodzi :-[

THX za wszystkie podpowiedzi, będe kombinował

0

Jest jeszcze jeden problem. Zrezygnowałem z DBImage i wrzuciłem TImage. Procedura do zapisu ze streamu działa prawidłowo, ale z odczytem są problemy:

var ms : TMemoryStream
begin
  ms  := TMemoryStream.Create;
  try
    with Table1 do
    begin
       (Fields[2] as TGraphicField).SaveToStream(ms);
    end;
    Image1.Picture.Graphic.LoadFromStream(ms); //- tu się wywala
  finally
    ms.Free;
  end;
end;

Albo nie odczytuje nic, albo wywala Access Violation :-8

0

Spróbuj zamiast:

(Fields[2] as TGraphicField).SaveToStream(ms);

napisać:

(Fields[2] as TBLOBField).SaveToStream(ms);

Może to pomoże.

0

Sorki, że dalej marudzę ale to dalej nie działa, chociaż nie wiem dlaczego.

jeżeli napiszę tak :

var ms :TMemoryStream;
      jpg : TJPEGImage;
begin
  ms  := TMemoryStream.Create;
  jpg  := TJPEG.Create;
  try
    with Table1 do
    begin
       (Fields[2] as TBLOBField).SaveToStream(ms);
    end;
    jpg.LoadFromStream(ms);
    jpg.SaveToFile('aaa.jpg');               // zapisany plik na dysku ma wielkość 0 kB. Dlaczego ??
    Image1.Picture.Graphic.LoadFromFile('aaa.jpg');
  finally
    ms.Free;
    jpg.Free;
  end;

a jeżeli tak:

var ms :TMemoryStream;
      jpg : TJPEGImage;
begin
  ms  := TMemoryStream.Create;
  JPG := TJPEGImage.Create;
  try
    with Table1 do
    begin
       (Fields[2] as TBLOBField).SaveToFile('aaa.jpg');
    end;
    Image1.Picture.Graphic.LoadFromFile('aaa.jpg');
  finally
    ms.Free;
  end;

to działa poprawnie [???]

1 użytkowników online, w tym zalogowanych: 0, gości: 1