HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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;







Cikksorozat

#IDKategóriaCikk címeSorozat
1166DelphiOsztály hierarchia lekérdezése1. rész
1180DelphiOsztály hierarchia lekérdezése2. rész


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!

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