SQLite blob i pliki PNG

SQLite blob i pliki PNG
S0
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 dni
0

Witajcie.
Mam problem z zapisywaniem obrazu z pliku PNG do bazy SQLite.
Mam bazę SQLite z polem Zdjecie (BLOB).
W Lazarusie pole to

Kopiuj
ZQueryTMPLegZdjecie: TZBlobField;

Zapisuje do niego różne pliki graficzne poprzez funkcję LoadFromFile

Kopiuj
ZQueryTMPLegZdjecie.LoadFromFile(plik)

Wszystko jest OK jeżeli wczytuje pliki JPG. Natomiast jeżeli próbuje wczytać plik PNG pojawia się error

Kopiuj
Stream read error

Smaczku dodaje fakt, że jeżeli zignoruje ten błąd, to program działa poprawnie, tzn. wczytuje jednak ten obraz, i potem wyświetla go poprawnie w kontrolce TDImage

Ktoś ma jakiś pomysł?? Skąd ten błąd.

Wiem, ze można (i pewnie należy) zdjęcia przechowywać poza bazą, ale jest to tylko tymczasowa baza wczytująca zdjęcia do wydruku i potem jest "zerowana", tak ze nie grozi jej zbytnie rozbudowanie.

Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-win64-win32/win64

Pozdrawiam Sc0liosis

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
0

A jak odczepisz TDImage to błąd nadal jest ?
A jak dodasz sto obrazków do bazy a potem skasujesz wszystkie to jaki jest rozmiar bazy ?


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
AD
  • Rejestracja:ponad rok
  • Ostatnio:około 2 godziny
  • Postów:335
0

A nie określasz gdzieś jakiego typu maja być te bloby? Moze tak jakis ze Reader spodziewa się JPG a dostaje png i dlatego rzuca błąd. Ogólnie trzymanie grafik w bazie to średni pompy a w sqlite to już całkiem bez sensu. Dużo będzie tych obrazków?

S0
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 dni
0

Marius.Maximus - masz rację, jak "odczepię" DBImage, to wszystko jest OK.
Ale nigdzie nie znalazłem określenia jakiego rodzaju obrazy będę wyświetlał za pomocą DBImage. Nic nie ustawiałem. A może cos przeoczyłem?

Baza będzie króciutka, zazwyczaj 10-20 rekordów, maksymalnie do 200. Jest ona wykorzystywana do jednorazowych wydruków i później może być usuwana.
Więc za każdym uruchomieniem mogę tworzyć bazę od nowa.

Pozdrawiam
Sc0li0sis

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
0

@Sc0li0sis:
A coś takiego dodać ?

Kopiuj
uses
  FPImage, FPImgCanv, FPReadPNG;

initialization
  RegisterClass(TFPReaderPNG);

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
MI
  • Rejestracja:około 7 lat
  • Ostatnio:5 dni
  • Postów:43
4

Komponent TDBImage wymaga dodatkowego nagłówka w blobie, którego nie posiadasz. Nagłówek to zapis łańcucha z nazwą rozszerzenia formatu obrazka, który jest dodawany przy zapisie obrazka w blobie za pomocą zmiany zawartości "TDBImage.Picture", a nie bezpośrednio przez pole blob:

Kopiuj
DbImage1.Picture.LoadFromFile(NazwaPliku);

Możesz też wykorzystać zdarzenie TDBImage.OnDBImageRead i samemu obsłużyć rozpoznanie typu i wczytanie obrazka.

Zobacz przykład w katalogu lazarus\examples\database\image_mushrooms.

A dlaczego działa z jpg? Dodatkowy nagłówek rozpoczyna się od długości łańcucha (integer) i następnie jego zawartości. Szczęśliwie nagłówek pliku jpk zaczyna się od bajtów $ff $d8 $ff $e1, co jest interpretowane jako liczba ujemna i nie jest podejmowana próba wczytania łańcucha. Inaczej w przypadku png, nagłówek zaczyna się od bajtów "%PNG" i jest interpretowany jako dość spora liczba i taką ilość bajtów próbuje się wczytać jako dodatkowy nagłówek i pewnie stąd ten błąd strumienia.

edytowany 1x, ostatnio: michalgw
B1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 3 godziny
  • Postów:398
0

A nie możesz na bazie trzymać path do załącznika (w dowolnym formacie) i w aplikacji go odczytywać bezpośrednio z dysku zamiast bawić się w bloby na bazie?

S0
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 dni
0

Przykład image_mushrooms też powoduje błąd Stream read error jeżeli próbuję wczytać plik PNG.

Sc0li0sis

MI
  • Rejestracja:około 7 lat
  • Ostatnio:5 dni
  • Postów:43
1

W tym projekcie wyłączono zapis dodatkowego nagłówka. Usuń linię 278 w pliku unit1.pas (https://gitlab.com/freepascal.org/lazarus/lazarus/-/blob/main/examples/database/image_mushrooms/unit1.pas?ref_type=heads#L278) i zacznie działać z plikami png. Nawiasem mówiąc przydała by się opcja pomijania dodatkowego nagłówka przy wczytywaniu (właściwość WriteHeader dotyczy tylko zapisu). Teraz można to zrobić jedynie obsługując zdarzenie OnDBImageRead.

S0
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 dni
0

Wielkie dzięki michalgw! Zadziałało

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.