Delphi - JPG és más típusú képek tárolása paradox táblában

forráskód letöltése
Sokszor szükségünk lehet arra, hogy egy hálózatos adatbázisban képeket tároljunk. Minél tömörebben tároljuk el képeinket, annál több helyet és időt takaríthatunk meg. A paradox táblák alkalmasak bináris adatok, így képek tárolására is. A legtömörebb képformátum kétségkívül a JPG, ennek használatával tudnánk a leghatékonyabb programot írni. Ahhoz, hogy JPG-t használjunk nem megfelelőek a Delphi alapkomponensei, egy kis trükkre van szükségünk.
A paradox táblák alkalmasak képek tárolására. A paradox mezőtulajdonságok között szerepel a „Graphic” típus. Ezt képek tárolására fejlesztették ki. Nagy hátránya azonban, hogy csak BMP formátumú képek befogadására alkalmas. A BMP formátumról köztudott, hogy rengeteg helyet foglal. Szükségünk lehet arra, hogy hálózatos programok készítése során képeket tároljunk egy adatbázisban. Programunk teljesítményét nagyon rontja a BMP formátum használata.
Egy kis trükk segítségével azonban univerzálissá tehetjük a paradox tábla Graphic mezőjét.
A paradox adattáblák Graphic és Binary mezőinek felépítése tulajdonképpen egyforma. A mezők tartalma nem a db állományba kerül, hanem az mb kiterjesztésű fájlba. Gyakorlatilag a kettő közül bármelyikben elhelyezhetünk objektumokat, így képeket is. Az eltárolt képnek egyetlen tulajdonságát kell megjegyeznünk, ez pedig a kiterjesztése. A kép kiterjesztése meghatározza annak formátumát (leszámítva a szándékos átnevezéseket).
Amennyiben JPG képekkel szeretnénk dolgozni, Delphi programunk forráskódjában a uses kulcsszó után fel kell venni a JPEG unit hivatkozást. Ez a unit tartalmazza a JPG képek kezeléséhez szükséges leírásokat.
A mellékelt példaprogram bemutatja a képek adattáblába történő elmentését és annak visszatöltését.
A képek eltárolásához a Kepek.db paradox 7 típusú adattáblát használja. Az adattábla a következő mezőkből áll:
Megnevezés Típus Hossz Leírás
Nev Alpha 20 A kép eredeti neve és elérési útja
Kiterjesztes Alpha 3 A kép kiterjesztése
Kep Graphic A kép
A Table1 komponensre duplán kattintva megjelenik a tábla mezőszerkesztője. Fontos, hogy itt meg legyenek adva a tábla mezői. Ezt úgy lehet elérni, hogy egyet kattintunk az egér jobb gombjával a mezőszerkesztőn, majd kiválasztjuk az „Add fields…” menüpontot. Ezután a mezőkre úgy is tudunk hivatkozni, hogy egymásután beírjuk a TTable komponens nevét és a mező nevét. Pl.: Table1Kep. Erre később szükségünk lesz.
Próbáljuk ki a példaprogramot és nézzük meg annak működését az alábbi lépések szerint.
A „…” gomb lenyomására megnyílik egy tallózás ablak. Keressünk egy tetszőleges képet, majd kattintsunk az OK gombra. A kép neve megjelenik a „Kép elérési útja” mezőben. Kattintsunk a „Kép hozzáadása a táblához” gombra. Ekkor a kiválasztott kép bekerül a táblába, amit a gomb alatt elhelyezkedő DBGrid komponens segítségével nyomon is követhetünk.
Most nézzük a forráskódot, hogy mi is zajlik a háttérben.
Ahhoz, hogy képet helyezzünk el az adattáblában, szükségünk van két változóra:
Blob : TBlobStream;
Stream : TMemoryStream;
A két objektum más-más tulajdonsággal rendelkezik. A TBlobStream képes arra, hogy egy bináris mezőbe értéket írjon, vagy onnan értéket olvasson be. A TMemoryStream viszont képes arra, hogy fájlból olvasson be, illetve fájlba írjon ki adatokat. Mindkettőnek van egy CopyFrom metódusa, amellyel egy másik Stream változó tartalmát át tudja másolni saját magába. A kettő együttes használatával megvalósítható az, hogy egy fájlból beolvassuk a képet a memóriába, majd onnan beírjuk azt az adattáblába. A beolvasás és a beírás kódja a következő:
Stream:=TMemoryStream.Create;
Stream.LoadFromFile(Edit1.Text);
Blob:=TBlobStream.Create(Table1Kep,bmWrite);
Blob.CopyFrom(Stream,0);
Blob.Free;
Stream.Free;
A TBlobStream létrehozásánál az adatbázis mező nevét a fentebb leírt módon lehet csak megadni. A Create metódus második paraméterében kell megadni a hozzáférés módját a tábla mezőjéhez. Ez itt bmWrite, azaz írás.
Fontos, hogy eltároljuk a kép kiterjesztését is, hiszen ez meghatározza a kép formátumát. Például egy JPG formátumú képet nem lehet BMP-ként feldolgozni.
Térjünk vissza példaprogramunkhoz.
Ha felvettük a képet az adattáblába, akkor most kattintsunk a „Kép megjelenítése” gombra. Ekkor a jobb oldalon megjelenik a kép. A kép megjelenítéséhez TImage komponenst használunk, nem TDBImage-et. A megjelenítési eljárás a beírásnak az ellenkezője. Most az adattáblából beolvassuk a képet a memóriába, majd onnan kiírjuk lemezre. Végül a TImage Picture.LoadFromFile metódusával betöltjük a képet, fájlból. A betöltés algoritmusa a következő:
Stream:=TMemoryStream.Create;
Blob:=TBlobStream.Create(Table1Kep,bmRead);
Stream.CopyFrom(Blob,0);
Stream.SaveToFile('Kep.'+Table1.FieldByName('Kiterjesztes').AsString);
Image1.Picture.LoadFromFile('Kep.'+Table1.FieldByName('Kiterjesztes').AsString);
Vegyük észre, hogy a TBlobStream Create metódusában most bmRead szerepel, azaz olvasás. Amikor elmentjük a képet fájlba, ugyanazt a kiterjesztést adjuk neki, mint ami eredetileg volt, ugyanis a TImage ez alapján fogja betölteni a képet.
Az eljárás korántsem olyan bonyolult, mint amilyenek első ránézésre tűnik és rengeteg helyet és időt megspórolhatunk vele. Ez egy hálózatos program írása során nagy kincs.