|
|
Bitmap importálása TXT-ből
|
|
Példaprogram letöltése
10190 bájt
|
Előző cikkben bemutattunk egy olyankomponenst, mely egy BMP képet konvertált TXT fájlba. Most bemutatjuk azt a komponenst, ami ezt a TXT fájlt be tudja olvasni, és elő tudja állítani belőle az eredeti képet.
A mellékelt példaprogram megnyitása előtt a TxtToBmp.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponensnek mindössze egy Execute nevű függvénye van, amelynek a visszatérési értéke egy TBitmap osztály, amiben a beolvasott képet kapjuk vissza. Az Execute függvény paramétereként meg kell adnunk a beolvasandó fájl nevét.
A fájl beolvasása némileg bonyolultabb, mint az előállítása, mivel itt egy beolvasott sorban több adat is található, és ezeket el kell különíteni egymástól. A TXT fájl soraiban található adatok mind számok, melyeket valamilyen nem szám karakter vagy karakterek választanak el egymástól. A sorok feldolgozására létrehoztunk egy függvényt, amely a paraméterként megkapott sztringből kiolvassa az abban található első számot és azt visszaadja, majd törli a sztringből a már feldolgozott karaktereket.
function GetFirstValue(var s:string):integer;
var p:integer;
numbers:set of char;
nums:string;
begin
A numbers változóban tároljuk a számként elfogadott karaktereket.
Ha a paraméter sztring nem egy üres sztring, akkor megkezdhetjük a feldolgozását.
Először meg kell keresnünk a szringben az első szám karakter pozícióját. A p változóban a sztring feldolgozandó karakterének sorszámát tároljuk.
p:=1;
while NOT (s[p] in numbers) and (p<=length(s)) do inc(p);
Ha megvan az első szám karakter, akkor egészen addig olvassuk a karaktereket, amíg szám karaktert találunk. Ezeket a kiolvasott karaktereket a nums sztring változóban tároljuk.
nums:='';
while s[p] in numbers do
begin
nums:=nums+s[p];
inc(p);
end;
Megvan a számunk, most már törölhetjük a feldolgozott karaktereket, és beállíthatjuk a visszatérési értéket.
Delete(s, 1, p);
end else nums:='0';
result:=StrToInt(nums);
end;
Ezzel tehát sikerült egy olyan függvényt készíteni, amivel sorban kinyerhetjük a számokat egy sztringből. Most következhet az Execute függvény leírása, amely a fájl beolvasását végzi.
function TTxtToBmp.Execute;
var fh:TextFile;
x,y:integer;
Pixel:PRGBArray;
bmp:TBitmap;
s:string;
begin
Létrehozunk egy TBitmap osztályú változót, amiben a beolvasott képet fogjuk tárolni.
Megnyitjuk a paraméterként megkapott nevű fájlt, és ha ez sikerült, akkor elkezdjük az adatok beolvasását.
AssignFile(fh, FileName);
{$I-}
Reset(fh);
{$I+}
if IOResult=0 then
begin
Beolvassuk az első sort, ami a kép szélességét és magasságát tartalmazza. A két érték között egy "x" karakter található.
A fent ismertetett GetFirstValue függvénnyel lekérdezzük az első számot, ami a kép szélessége lesz. Utána ugyanezzel a függvénnyel lekérdezhetjük a második számot is, ami a kép magasságát adja meg.
bmp.Width:=GetFirstValue(s);
bmp.Height:=GetFirstValue(s);
bmp.PixelFormat:=pf24bit;
bmp.Dormant;
A TBitmap.Dormant eljárással létrehozunk egy üres bitképet. Erre feltétlenül szükség van, hogy a megfelelő memóriaterület rendelkezésünkre álljon. A képpontok beolvasása ugyanazzal a módszerrel történik, mint ahogyan a kiírást csináltuk. Először az első sor képpontjait olvassuk, majd folyamatosan a többit.
A Scanline függvénnyel lekérdezzük az aktuális sor címét, és eltároljuk a Pixel változóban, amely egy TRGBTriple tömbre mutat.
for y:=0 to bmp.Height-1 do
begin
Pixel:=bmp.ScanLine[y];
Ezután elkezdjük az aktuális sor pontjait beolvasni. A fájlban egy sor egy képpont szín adatait tartalmazza. Egy színt három színösszetevőből tudunk előállítni: piros, zöld, kék. Ez tehát azt jelenti, hogy minden beolvasott sor három számot fog tartalmazni, amelyeket sorban a GetFirstValue függvénnyel tudunk lekérdezni. Az első szám a piros, a második a zöld, a harmadik pedig a kék színösszetevő értéke.
for x:=0 to bmp.Width-1 do
begin
ReadLn(fh, s);
Pixel[x].rgbtRed:=GetFirstValue(s);
Pixel[x].rgbtGreen:=GetFirstValue(s);
Pixel[x].rgbtBlue:=GetFirstValue(s);
end;
end;
A képpontok beolvasása után lezárhatjuk a fájlt, és a visszatérési értékként a beolvasott képünket adjuk meg.
CloseFile(fh);
end;
result:=bmp;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 255. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|