Poprawienie kompresji pliku

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.

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

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 ??

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

0

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

-- kod SQL w ZQuery1
-- SELECT idobrazka, dane FORM obrazki LIMIT 1
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:

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ć.

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 :)

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