Anda di halaman 1dari 7

Admin

Ngy tham gia: Ch nht Thng 11 25, 2007 2:23 pm


Bi vit: 338
Given: 5 thanks
Received: 191 thanks
Bi ny ni qua mt s iu cn bit c th c c file nh, chnh sa trn tng
pixel ca nh trong C#. Khng lm 1 c th no, nhng cc bc tin hnh ca cc
bi c th th cng na n nh vy. Km theo 1 ci code v d mi ngi ngm
cu.
* c nh trong C#:
Dng 1 i tng ca lp Bitmap to mi 1 nh( mi hon ton hay c mi t
file).
VD:
Bitmap bm = new Bitmap("C:\Pictures\abc.jpg");
// lnh trn khai bo 1 bin bm, l 1 nh ly t C:\Pictures\abc.jpg
* In nh ln form:
c c vo bin ri, gi phi in ra mi ngi cng thy ng khng? Dng
phng thc DrawImage hin nh ln
V d: Hin nh ln form chnh
Graphics gr = CreateGraphics();// Khi to ho trn form chnh
gr.DrawImage(bm,0,0);
gr.Dispose()// Gii phng bin graphics
Cc tham s ca DrawImage l:
bm: nh cn a ra mn hnh
0,0 : to gc trn bn tri ca nh
* Truy xut v thay i tng pixel nh:
**Cu trc file nh:
L 1 ma trn 2 chiu cc pixel, nh thng thng l nh 24 bt, tc l mi pixel 24 bits=
3 bytes. Chng ta tng tng nh sau: pixel u tin ca nh chim 3 byte u (0,1,2);
pixel th 2 chim 3 byte tip (3,4,5); c nh th...

bit nh bm c kch thc bao nhiu, C# cung cp 2 thuc tnh:


bm.Width: s pixel trn 1 hng( rng)
bm.Height: s hng( cao)
Nh vy, mi hng ca bc nh s dng ht bm.Width*3 bytes lu thng tin (do
mi pixel 3 byte)
Tuy nhin khi lu vo my, th mi hng ca nh phi dng nhiu hn s byte
lu, v mc ch lu c thng tin ca bin th phi( ci ny s xem thm).
bit thc s s byte ny l bao nhiu, u tin phi chuyn bm sang 1 lp m, lp
BitmapData
V du:
Rectangle rec = new Rectangle(0,0,bm.Width,bm.Height);
BitmapData bmData = bm.LockBits(rec, ImageLockMode.ReadWrite,
PixelFormat.24bitrgp);
Cu lnh u tin khai bo 1 hnh ch nht rec, chnh l kch thc ca nh bm, v dng
lm tham s cho cu lnh pha di.
Phng thc LockBits s chuyn t 1 nh, sang 1 vng nh (bmData). Trn nh bm, ta
ch c th xem n, ch khng th chnh s pixel. Mun sa, phi chuyn n sang lp
BitmapData, trn c cc th cn thit can thip vo tng im nh.
By gi, bmData s "tr cng" cho ta bng cch cung cp cho ta 2 thuc tnh quan trng:
- bmData.Stride: s byte thc s m my tnh lu tr mi hng ca nh. Quan trng, v
nu ta ngh nh kch thc 5x5, th lu trn a 5x3=15 byte 1 hng, nhng nu
stride=16, th khi ta mun xung dng th 2 r x l tip, ta truy xut vo byte th 16,
th thc t ta li truy xut vo ci ra ca dng 1.
- bmData.Scan0: ch l s 0, khng phi ch O.
Ci ny ch ra a ch pixel u tin ca nh m bmData qun l. Mun thay i tng
pixel ta phi bit ci ny, ri dng con tr tr n a ch , thay i, sau dch con
tr ln 1 n v, tip tc thay i tip. T tng l vy.
** Ghp my th long ngong trn x l 1 bc nh xem no:
t ra 1 v d: c 1 bc nh v hin ln form, khi ngi dng nhn vo 1 nt trn
form, bin bc nh thnh ton mu trng.
Cc bc c nh v hin th ni trn. y ta ch quan tm n vic thay tt c
cc pixel ca nh thnh pixel mu trng. Ch mu trng l c 3 byte ca n u bng
255.
BitmapData bmData = bm.LockBits(rec, ImageLockMode.ReadWrite,
PixelFormat.24bitrgp);
int stride = bmData.Stride;
int nOffset = stride - bm.Width*3;
//nOffset chnh l ci ra ca bc nh, khi con tr x l n pixel cui cng ca hng, th
mun xung //hng k tip, ta phi b qua ci ra ny bng cch cng thm a ch con

tr vi nOffset
byte *p = (byte*)bmData.Scan0;
//p s tr n a ch u ca nh
int x,y;
for(y = 0; y<bm.Height; y++)
{
for(x = 0; x<bm.Width; x++)
{
//X l 3 byte ca pixel
p[0] = 255;
p[1] = 255;
p[2] = 255;
//Chuyn con tr sang pixel k tip
p += 3; // 2 pixel k tip cch nhau 3 bytes
}//X l xong 1 hng
//Chuyn con tr xung hng k tip
p += nOffset;
}
bm.UnLock(bmData);//gii phng bin BitmapData
on lnh trn s bin bc nh thnh mu trng.
** Demo code:
Code km theo lm 2 thao tc v d cho vic x l:
- Tng mu ca mi pixel nh ln 20 (menu Contrast - ko bit dng t ny c ng
khng, dt t.Anh qu42)
- Thc hin ly nghch o 1 nh( php ton NOT)
<t>
10. X l nh
Quote:
- Thng thng x l nh c lp trnh trn cc ngn ng thuc h C, l do n
gin v cc ngn ng ny h tr con tr (pointer) nhm truy cp trc tip v cc nh,
gip qu trnh x l nh c nhanh hn thay v truy cp mt cch gin tip.
- Mc ch ca x l nh:
+ Tng cng, phc hi, nng cao cht lng nh
+ Trch lc thng tin t nh
- Cc php x l thng p dng trn nh nh phn, hoc nh mc xm

- C 2 min x l chnh:
+ Khng gian
+ Tn s
- C 3 loi x l chnh:
+ X l trn im nh
+ X l ln cn
+ X l ton cc (thng c x l trn min tn s)
- Nhng kin thc c bn lin quan:
+ Khng gian mu RGB
+ C bn v nh s
+ Cch biu din nh s
+ phn gii nh, mu
+ Ngn ng lp trnh
PHN X L TRN MIN KHNG GIAN
1. Chuyn i c bn
1.1 S dng phng thc Set-GetPixel
- Thng thng nh c x l trn nh mc xm (mt lp mu), nh trng en (nh
nh -phn)
- Vy lm sao chuyn mt nh mu v nh mc xm hay nh nh phn?
- Nh cc bn bit
+ Mt nh mc xm c ngha l: mt im nh trong nh ny c biu din bng
mt s 8 bit = 2^8=256 gi tr t ti ti sng
+ Mt nh nh phn: mt im nh c biu din bng s mt bit = 2^1=2 gi tr ti
v sng

+ nh mu ng nhin c tng hp t 3 mu R-G-B


V d:

- chuyn nh mu v nh xm chng ta c cng thc sau:


a. O(x,y)=( IR(x,y) + IG(x,y) + IB(x,y)) /3
Vi:
x,y l to ca im nh
IR thnh phn mu ti mu I(x,y)
IG thnh phn mu xanh l ti mu I(x,y)
IB thnh phn mu xanh dng ti mu I(x,y)
O(x,y): m u ra, I(x,y) mu u vo
b. O(x,y)= IR(x,y) * 0.287 + IG(x,y) * 0.599 + IB(x,y) * 0.114
V d 1: S dng cng thc b cho v d 1 nh sau:
Code:
private Bitmap ToGray(Bitmap bm)
{
Bitmap bitmap = new Bitmap(bm);
int x, y;
Color c;
Byte gray;
for (y = 0; y < bm.Height - 1; y++)
{
for (x = 0; x < bm.Width - 1; x++)
{
c = bm.GetPixel(x, y);
gray =Convert.ToByte(c.R * 0.287 + c.G * 0.599 + c.B * 0.114);
bitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
}
}
return bitmap;
}

Kt qu th nghim nh sau:

- i vi nh nh phn ta kim tra gi tr mu nu <128 th set li gi tr l 0 ngc li


set gi tr l 255. Ta c cng thc sau:
O(x,y)= 0 nu I(x,y) < C
BeerO(x,y)= 255 ngc li
Vi C l ngng (-1 < C < 256) cn phn ngng
V d 2:
Code:
private Bitmap ToBinary(Bitmap bm, Byte band)
{
Bitmap bitmap = new Bitmap(bm);
int x, y;
Color c;
for (y = 0; y < bm.Height - 1; y++)
{
for (x = 0; x < bm.Width - 1; x++)
{
c = bm.GetPixel(x, y);
if (c.R < band)
bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));
else
bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));
}
}
return bitmap;
}

- hm trn nu c.R < band chng ta s dng l c.R v i vi nh mc xm th 3


thnh phn mu bng nhau nn khng cn phn bit c.R, c.G hay C.B.
- Bn hy to 1 project ri kim th n.

1.2 S dng LockBits


- Nhn li v d 2, chuyn g xy ra: Chy tt, nhng vn l thi gian
- Hai hm trn u s dng 2 phng thc set v get, v mt thut ton c l bn ngh
2 vng lp lm cho chng trnh tr nn qu ra ng thi nu s dng nh c
phn gii hi ln t l c th treo lun.
- Vn khng phi gii thut m chnh do 2 phng thc set v getpixel gy nn, khi
bn gi 2 phng thc ny h iu hnh Win s Lock nh li n khi kt thc
phng thc va goi t ng s UnLock nh cho vit truy cp ln sau. Chnh vic
Lock ri Unlock lin tc lm lm cho hm trn x l chm ri t tn.
- Gii thut sau dng k thut LockBits
Code:
private Bitmap ToBinaryLocBits(Bitmap bm, Byte band)
{
Bitmap bitmap = new Bitmap(bm);
Rectangle rec = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
System.Drawing.Imaging.BitmapData bmpData = bitmap.LockBits(rec,
System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
Int32 bytes = bmpData.Stride * bitmap.Height;
Byte[ rgbValues = new Byte[bytes - 1];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
Byte color;
for (int counter = 0; counter < rgbValues.Length - 1; counter += 4)
{
color = rgbValues[counter];
if (color < band)
{
rgbValues[counter + 0] = 0;
rgbValues[counter + 1] = 0;
rgbValues[counter + 2] = 0;
}
else
{
rgbValues[counter + 0] = 255;
rgbValues[counter + 1] = 255;
rgbValues[counter + 2] = 255;

Anda mungkin juga menyukai