Poprawienie kompresji pliku

Poprawienie kompresji pliku
woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

Witam mam programik ktory zapisuje dane do bazy postgresql. Program dziala jak nalezy (no prawie) dane zapisuja sie do tabeli obrazy w pole bytea wpisuje sie strumien ze zdjeciem ale ... przy odczytywaniu zdjecie ani troszke nie przypomina tego ktore zaladowalismy.

Kopiuj
procedure TForm1.Button2Click(Sender: TObject);
var obrazek : TJPEGImage ;
    strumien : TMemoryStream ;
begin
  obrazek := TJPEGImage.Create ;
  strumien := TMemoryStream.Create ;
  try
    obrazek.Assign(Image1.Picture.Bitmap);
    obrazek.CompressionQuality := 100;
    obrazek.Compress ;
    obrazek.SaveToStream(strumien);
    with ZQuery1 do
     begin
       ZQuery1.ParamCheck := true ;
       SQL.Text := format('INSERT INTO obrazki (idobrazka, dane) VALUES (%d, :dane )', [SpinEdit1.Value])  ;
       ParamByName('dane').LoadFromStream(strumien, ftGraphic )  ;
       ExecSQL ;
     end;
  finally
    strumien.Free ;
    obrazek.Free ;
  end;
end;

Wydaje mi sie ze blad lezy wlasnie po stronie kompresji i zapisu do bazy gotowy program z kodami pod adresem:

http://odsiebie.com/pokaz/4039668---6c5d.html

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

Po wywolaniu selecta z tej tabeli z pola dane wyskakuje takie cos:
0; ˙Ř˙ŕ

Zamiast i dlatego taki dziwny obrazek jest wyswietlany. Czy ktos moze cos doradzic ??

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

Ok udalo sie to poprawic ... wystarczylo zrobic 2 rzeczy na komponencie ZConnection trzeba w properties dodacoidasblob=true
oraz parametrt:
TransactIsolationLevel na tiReadCommitted

To tyle gdyby ktos mial kiedys problem z zapisaniem obrazkow do bazy danych to mam gotowy program i chetnie sie nim podziele

AsYlum
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
0

Ja wykorzystywałem trochę inną metodę. Wyglądała ona mniej więcej tak:

Kopiuj
-- kod SQL w ZQuery1
-- SELECT idobrazka, dane FORM obrazki LIMIT 1
Kopiuj
with ZQuery1 do
begin
	Append;
	FieldByName('idobrazka').AsInteger := SpinEdit1.Value;
	(FieldByName('body') AS TBlobField).LoadFromStream(strumien);
	Post;
end;

Do komponentu ZQuery1 dopinamy ZUpdateSql w InsertSQL dodajemy:

Kopiuj
RESET client_encoding;
INSERT INTO obrazki(idobrazka, dane) VALUES(:idobrazka, :dane);
SET CLIENT_ENCODING TO 'WIN1250';

Pisane z pamięci, ale powinno działać. W nowszych wersjach komponentów Zeos trick z resetowaniem kodowania już chyba nie jest potrzebny. Postaram się to później sprawdzić.

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

No wlasnie w tym sęk ... przy przekazywaniu parametrow do bazy danych w kodowaniu WIN1250 na delphi 2009 uzywajac najnowszych (beta) zeosow w polaczeniu z PostgreSQL 8.3 kodowanie sie sypie na maxa ... odczyt z bazy byl taki jak powinien byc niestety przy wyslaniu polskich znakow do nawet pola varchar przez zeosy byly rozne krzaczki. Przekonwertowalem baze na UTF8 zeosy koduje tez na UTF8 i kodowanie jest poprawne a przy przesylaniu do pola OID trzeba na zconnection dodac oidasblob=true i samo client_encoding sie sypie (nie wiem dlaczego) w kazdym razie po tych drobnych przerobkach programik dziala jak cos to postaram sie go umiescic gdzies na necie i rzucic linka :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.