Professional Documents
Culture Documents
Đọc ảnh trong C
Đọc ảnh trong C
Dng 1 i tng ca lp Bitmap to mi 1 nh( mi hon ton hay c mi t file). VD: Code:
Bitmap bm = new Bitmap("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 Code:
Graphics gr = CreateGraphics();// Khi to ho trn form chnh gr.DrawImage(bm,0,0); gr.Dispose()// Gii phng bin graphics
Code:
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. Code:
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
** 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) - Thc hin ly nghch o 1 nh( php ton NOT) Ni dung Ni dung chnh ca chung trnh nm trong file Filter.cs, l ni cha cc hm thc hin cc b lc. Cc hm ny s tr v gi tr true nu lc nh thnh cng v false nu ngc li. Chng ta s lm vic i vi cc nh l Bitmap ( cc nh thuc cc nh dng khc u c th d dng chuyn v nh Bitmap) v mt i tng quan trng l BitmapData, nh s c x l trn chnh i tng BitmapData ny. Cu trc ca nh Bitmap: nh Bitmap l mt ma trn cc pixel, chng hn nh vi nh 24 bits th s c 3 bytes dnh cho mi pixel ( mi byte 1 mu ng vi blue, green, red ). Nh vy pixel u tin s chim 3 bytes u (0,1,2); pixel tip theo l (3,4,5) v tip tc. Tuy nhin i tng Bitmap ch dng hin th bc nh. c th x l bc nh, ta cn phi to ra i tng BitmapData thng qua phng thc LockBits ca i tng Bitmap nh sau:
CODE(M) BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // b.Width: rng ca bc nh // b.Height: cao ca bc nh // PixelFormat.Format24bppRgb: ch ra l nh 24 bits
C th coi BitmapData l mt vng nh m lu tr d liu ca bc nh m thng qua n bn c th chnh sa bc nh theo mnh. BitmapData c nhng thuc tnh quan trng nh sau: Scan0 a ch trong b nh ca mng d liu Width rng tm nh ( s pixel) Height cao tm nh Stride rng theo byte ca mi dng, lun lun ln hn Width PixelFormat nh dng chnh xc ca bc nh
Nh trn hnh v, thuc tnh Stride mang gi tr l rng ca mt hng tnh theo byte, tuy nhin khng phi lc no cng chnh xc bng s pixel nhn vi s byte mi pixel ( v d 3 * b.Width vi nh 24 bits). Nguyn nhn l tng hiu nng, h thng s lun mc nh cho gi tr tnh theo byte mi hng chia ht cho 4. V d nh mt bc nh 24 bits c 17 pixel mi hng th s c Stride = 52, trong used pixel data = 3*17 = 51 v 1 byte cn li c thm vo c l 52 = 4*13. ( phn thm vo gi l Padding, hay Offset )