|
|
Kép széleiről a felesleges részek eltávolítása
|
|
Példaprogram letöltése
15956 bájt
|
Egy kép méretét nagyban megnövelheti a kép szélein lévő háttérszínű, felesleges részek. Ebben a példában egy olyan függvényt készítünk, amely a paraméterként megadott bitképről törli ezeket a részeket, így a kép méretét esetenként jelentősen csökkentheti.
A függvény első paramétere a bitkép objektuma lesz (TBitmap), a második a háttér színe, a harmadik pedig a keret szélessége. A cél, hogy a lehető legkisebb méretre „vágjuk” a képet úgy, hogy a képet alkotó pixelekhez nem nyúlunk, tehát minőségromlás nem történik. A feladat megoldásához meg kell határozni annak a befoglaló téglalapnak a méretét, amibe a tényleges képet alkotó összes pixel belefér. Ez a legtöbb kép esetén megegyezik a kép teljes területével, de ha a kép szélein lévő sorokban illetve oszlopokban azonos színű pixelek találhatók, akkor a befoglaló négyszög kisebb lesz.
Első lépésben a paraméterként megadott háttérszínt átalakítjuk valódi RGB formátumra. Erre azért van szükség, hogy majd össze tudjuk hasonlítani a kép pixeleinek színével, és ha a háttérszín egy olyan konstanssal van megadva, ami nem RGB formátumú színt tartalmaz (pl. clBtnFace), akkor az összehasonlítás nem adna megfelelő eredményt.
var
bgcol: dword;
...
bgcol:=ColorToRGB(BackgroundColor) and clWhite;
Ezután egy TRect típusú struktúrában beállítjuk a befoglaló téglalap koordinátáit. Ezt szándékosan úgy tesszük meg, hogy a bal felső sarok koordinátáiba a jobb alsóét, a jobb alsóba pedig a bal fölsőét írjuk. Ez a kép feldolgozása során természetesen változik, mint majd látni fogjuk.
Egy ciklusban beolvassuk a kép pixeleit sorban egymás után. Ha az aktuális pixel színe eltér a háttérszíntől, akkor a befoglaló téglalap koordinátái a következők alapján változnak (x és y a pixel koordinátái, az r pedig a befoglaló téglalap széleinek koordinátáit tartalmazza):
- var
- r: Trect;
- ...
- r:=Rect(Min(x, r.Left), Min(y, r.Top), Max(x, r.Right), Max(y, r.Bottom));
Tehát ha x kisebb, mint a bal szél koordinátája, akkor ez lesz ezentúl a bal szél kordinátája, illetve ha x nagyobb, mint a jobb szél koordinátája, akkor ez lesz a jobb szél koordinátája. Ugyanez történik y esetében is, de ott a felső és az alsó szélek koordinátáit figyeljük.
Mire beolvastuk a kép összes pixelét, az r rekordban a befoglaló téglalap koordinátáit fogjuk megtalálni. Ez a legkisebb befoglaló téglalap, de a BorderSize paraméter értékétől függően ennek mérete csökkenhet (negatív érték esetén), illetve nőhet. Ez utóbbi eseben a megadott szélességű, háttérszínű keret lesz a kép szélein, míg az előző esetben a kép egyes részei kilógnak a képből, tehát elvesznek.
A téglalap koordinátáit legegyszerűbben az InflateRect függvénnyel tudjuk módosítani:
InflateRect(r, BorderSize, BorderSize);
Ennek első paramétere egy TRect típusú rekord, aminek a méretét változtatni szeretnénk. A második és a harmadik paraméter az X illetve X irányú változtatás mértéke pixelben. Ezek az értékek adódnak hozzá mind a négy koordinátához.
Ha megvan a végleges téglalap, akkor az általa meghatározott területet a 0,0 pontba toljuk:
BitBlt(
Bitmap.Canvas.Handle, 0, 0, r.Right-r.Left+1, r.Bottom-r.Top+1,
Bitmap.Canvas.Handle, r.Left, r.Top, SRCCOPY);
Ezután már nincs más dolgunk, mint a bitkép méretét a téglalap méretéhez igazítani:
Bitmap.Width:=r.Right-r.Left+1;
Bitmap.Height:=r.Bottom-r.Top+1;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 550. 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!
|