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
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
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.
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 [???]
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;
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'
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.
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]
(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ł
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
Spróbuj zamiast:
(Fields[2] as TGraphicField).SaveToStream(ms);
napisać:
(Fields[2] as TBLOBField).SaveToStream(ms);
Może to pomoże.
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 [???]