|
|
Bitmap exportálása TXT-be
|
|
Példaprogram letöltése
118078 bájt
|
Ebben a cikkben egy olyan komponenst mutatunk be, amellyel egyszerűen konvertálhatunk egy BMP képet TXT fájlba úgy, hogy abból bármikor egyszerűen előállítható az eredeti kép.
A mellékelt példaprogram megnyitása előtt a BmpToTxt.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponensnek két property-je van. A Picture property-ben adhatjuk meg azt a BMP képet, amit konvertálni szeretnénk. A FileName property annak a fájlnak a neve, amibe a képet konvertáljuk. A kép csak 24 bites színmélységű lehet.
A fájl formátuma, amibe a képet konvertáljuk nagyon egyszerű: az első sorban tároljuk a kép szélességét és magasságát, egy "x" karakterrel elválasztva (pl. "320x200"). A többi sorban a képet alkotó pontokat tároljuk. Minden egyes sorban egy képpontot tárolunk úgy, hogy az egyes színösszetevőket írjuk egymás mellé, vesszővel elválasztva. Az első színösszetevő a piros, a második a zöld, a harmadik pedig a kék. A képpontokat balról-jobbra és felülről-lefelé haladva vesszük sorra, és ebben a sorrendben tároljuk el.
A komponensnek van egy Execute nevű függvénye. A függvény visszatérési értéke igaz, ha sikerült a konvertálás, és hamis, ha valamilyen hiba lépett fel a konvertálás során.
A Pixel változó PRGBArray típusú pointer. Ez egy TRGBTriple tömbre mutat, amelynek segítségével egyszerűen lekérdezhetjük majd a képpontok színösszetevőit.
function TBmpToTxt.Execute;
var fh:TextFile;
x,y:integer;
Pixel:PRGBArray;
begin
result:=False;
Csak akkor konvertáljuk a képet, ha az 24 bites, és nem üres:
if (not FBitmap.Empty) and
(FBitmap.PixelFormat=pf24bit) then begin
Megnyitjuk a fájlt, amibe a kép adatait mentjük:
AssignFile(fh, FileName);
{$I-}
Rewrite(fh);
{$I+}
Ha sikerült a fájlt megnyitni, akkor kezdődhet az adatok kiírása:
Először kiírjuk a kép szélességét (FBitmap.Width)és magasságát (FBitmap.Height) úgy, hogy a két szám közé egy "x" karaktert teszünk.
WriteLn(fh, IntToStr(FBitmap.Width)+'x'+
IntToStr(FBitmap.Height));
Ezután jöhet a képpontok kiírása. A képpontok színét balról-jobbra és felülről-lefelé haladva vesszük sorba. Az FBitMap.ScanLine property segítségével lekérdezzük a kiírandó sor címét, és átadjuk a Pixel pointer-nek.
for y:=0 to FBitmap.Height-1 do
begin
Pixel:=FBitmap.ScanLine[y];
Végighaladunk az aktuális soron, és kiírjuk a megfelelő sorszámú képpont színösszetevőit vesszővel elválasztva.
for x:=0 to FBitmap.Width-1 do
begin
WriteLn(fh,
IntToStr(Pixel[x].rgbtRed)+', '+
IntToStr(Pixel[x].rgbtGreen)+', '+
IntToStr(Pixel[x].rgbtBlue));
end;
end;
Ha minden pixelt kimásoltunk, akkor lezárhatjuk a fájlt.
CloseFile(fh);
result:=true;
end;
end;
end;
Ha egy 3x2 pixeles képet konvertálunk, akkor a fájl tartalma valahogy így néz ki:
3x2
255, 0, 0
0, 255, 0
0, 0, 255
255, 255, 255
128, 128, 128
0, 0, 0
Ennek a képnek az első sorában egy piros, egy zöld és egy kék képpont van, míg a második sorban egy fehér, egy szürke és egy fekete pont.
Most már el tudunk menteni egy képet ASCII fájlba, de mire megyünk vele? Innentől kezdve akár egy szövegszerkesztővel is készíthetünk képeket!
Ebben a formában persze nem tudjuk felhasználni, amíg nem készítünk egy olyan komponenst, ami be is tudja ezt a szöveget olvasni és azt konvertálni képpé. Ehhez a jövő heti számunkban készítünk egy komponenst.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 241. 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!
|