HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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.
  numbers:=['0'..'9'];
Ha a paraméter sztring nem egy üres sztring, akkor megkezdhetjük a feldolgozását.
  if s<>'' then
  begin
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.
  bmp:=TBitmap.Create;
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ó.
    ReadLn(fh, s);
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;

Cikksorozat

#IDKategóriaCikk címeSorozat
3333WindowsNet Shell parancsok1. rész
3367WindowsNet Shell parancsok2. rész
3396WindowsNet Shell parancsok3. rész


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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |