77
Lớp đối tượng Graphics. Lớp Polygon. Cách vẽ văn bản. Chế độ vẽ ảnh. Cách vẽ ảnh. Lớp MediaTracker và mục đích của nỏ. Các đối tượng tiện ích khác (Graphics Utility). Lớp Color và cách pha màu. Kỹ thuật tạo vùng cắt (clliping). In ẩn. í h ư ơ n g 6 : Đ ô i t ư n g đ h a ( G r a p h i c s ) 1 1 5 È l hương 6: _________________ĐỐI TƯỢNG Đỏ HỌA (GRAPHICS) ____________________ Tóm tắt chươnữ 6: Trong chương này chúng ta sẽ tìm hiểu về các thành phần đồ họa ca bán cùa Java ớ mức său han. Ta sẽ học về đối tượng đồ họa Graphics thuộc lớp thư viện awt cùng với những phương thức mà nó hỗ trọ như paint, update, repaint sau đó sẽ làm quen với cách vẽ đường thẳng, vòng tròn, ellip, hình chữ nhật, đa giác... cũng như làm thế nào để vẽ văn bản bằng nhiều Font chữ khác nhau, điều khiển quá trình nạp và xử lý ảnh của Java thông qua lớp MediaTracker, áp dụng các chế độ vẽ ảnh, cách vẽ ánh và ca chế xử lý màu sắc của lớp Color. Các vấn dề chính sẽ được đề cập đến : KHÁI QUÁT Khi lập trình cho các môi trường Windows, một vân đề nan giải thường gặp là người lập trình phái tập làm quen với các hàm họa API (Application Programming Interface) riêng của mỗi hệ. Chẳng hạn Microsoft Windows mà ta quá quen thuộc có những API riêng không giông gì với các hàm API của hệ Windows OS/2 hay X-Windows API, Mac API ... Môi trường Internet là môi g toàn cầu, chương trình của mỗi cá nhân hay một tố chức có thể dược đem xuông (download) và chạy trên bất kỳ máy nào, điều ta không hề biết trước được đó dang sử dụng môi trường nào. Java ra đời cũng để giải quyết giùm các nhà lập trình cũng như i dùng vấn dề hóc búa này. Tôn chỉ của những nhà phát triển ngôn ngữ Java “viết một lần chạy ở khắp nơi” chính là một minh g. Các hệ Windows (platform) tuy sử dụng các hàm API khác nhau nhưng lại thường phục vụ chung cho một mục đích nhất định Vẽ đường thẳng, đường tròn, tô màu, trình bày hình ảnh... Một diều cần lưu ý nữa là cảm quan (look and feel) hay phong cách hiện giao diện đồ họa của mỗi hệ lại có những đặc trưng riêng của mình, đơn cử chẵng hạn với đốỉ tượng giao diện thông thường mon control) như nút nhấn (button), danh sách (list) ... mỗi môi trường Windows lại có cách vẽ những đối tượng trẽn theo hình riêng của mình. Các hàm API mà máy ảo Java (thông qua các lớp thư viện) sẽ cung cấp cho ta những chức năng đồ họa thông thường nhất mà cứ hệ Windows nào cũng phải có. Khi sử dụng các hàm đồ họa của Java, ta sẽ không phải quan tâm đến các hàm API đặc thù của môi trường nữa, máy ảo Java và các lớp thư viện hỗ trợ sẽ giúp chuyển đổi các hàm API trở nên thích hợp với mỗi hệ diều hành, dụng của ta viết trên môi trường Microsoft Windows sẽ có phong cách (style) của Microsoft (như cách vẽ các nút nhấn, cửa sổ ...), khi chạy trên hệ Windows Solaris sẽ mang phong cách của Sun, hay trên OS/2 sẽ mang phong cách của IBM ... Sun gọi các hàm API của ngôn ngữ Java đã được thiết kê mức trừu tượng (hay tổng quát hóa để thích nghi với nhiều hệ điều - multiplatform) là AWT. Lớp thư viện AWT mà ta đã nghiên cứu một phần ở chương trước chỉ đề cập đến các đôi tượng giao đồ họa thông thường (common control) như nút nhấn (button), ô đánh dấu (checkbox) , ô văn bản (TextField)... Phần ta sẽ nghiên cứu các chức năng đồ họa của Java mức thấp hơn (low level), như kẻ từng đường thẳng, vẽ từng diểm ảnh, thiêt màu sắc ... Tất cả những chức năng này thường tập trung vào đối tượng đồ họa Graphics mà ta cũng đâ từng biết đến qua các ng trình trước (ít ra đô’i tượng Graphics vẫn thường được thể hiện trong phương thức paint (Graphics g)). Bây giờ ta sẽ bắt đầu đi vào chi tiết các thành phần dồ họa. PHÂN BIỆT PHƯƠNG THỨC PAINTO, REPAINTO VÀ UPDATE0 Như các chương trước đã từng viết cho Applet, muôn Applet vẽ ra được một cái gì đó thường ta phải cài dặt phương thức " nt cho lớp Applet như sau: public void paint (Graphics g) { > Tâ’t cả hình ảnh muôn vẽ ta đều phải dùng đến đôi tượng Graphics g, đốĩ tượng Graphics tựa như một cầy cọ để sơn "t lên Applet. Bất cứ khi nào Applet cần thiết phải được tái tạo lại nó đều gọi đến phương thức paint () để vẽ lại hình ảnh. Tuy nhiên, không nhất thiết lúc nào cũng phải gọi đến paint () bởi vì việc thực hiện tất cả

sử lý ảnh java

Embed Size (px)

DESCRIPTION

xử lý ảnh bằng java

Citation preview

hng 6 : i tng ha (Graphics)115 lhng 6:I TNG HA (GRAPHICS)Tm tt chn 6:Trong chng ny chng ta s tm hiu v cc thnh phn ha ca bn ca Java mc su han. Ta s hc v i tng ha Graphics thuc lp th vin awt cng vi nhng phng thc m n h tr nh paint, update, repaint sau s lm quen vi cch v ng thng, vng trn, ellip, hnh ch nht, a gic... cng nh lm th no v vn bn bng nhiu Font ch khc nhau, iu khin qu trnh np v x l nh ca Java thng qua lp MediaTracker, p dng cc ch v nh, cch v nh v ca ch x l mu sc ca lp Color.Cc vn d chnh s c cp n :Lp i tng Graphics.

Lp Polygon.

Cch v vn bn.

Ch v nh.

Cch v nh.

Lp MediaTracker v mc ch ca n.

Cc i tng tin ch khc (Graphics Utility).

Lp Color v cch pha mu.

K thut to vng ct (clliping).

In n.

KHI QUTKhi lp trnh cho cc mi trng Windows, mt vn nan gii thng gp l ngi lp trnh phi tp lm quen vi cc hm ha API (Application Programming Interface) ring ca mi h. Chng hn Microsoft Windows m ta qu quen thuc c nhng API ring khng ging g vi cc hm API ca h Windows OS/2 hay X-Windows API, Mac API ... Mi trng Internet l mi g ton cu, chng trnh ca mi c nhn hay mt t chc c th dc em xung (download) v chy trn bt k my no, iu ta khng h bit trc c dang s dng mi trng no. Java ra i cng gii quyt gim cc nh lp trnh cng nh i dng vn d hc ba ny. Tn ch ca nhng nh pht trin ngn ng Java vit mt ln chy khp ni chnh l mt minh g. Cc h Windows (platform) tuy s dng cc hm API khc nhau nhng li thng phc v chung cho mt mc ch nht nh V ng thng, ng trn, t mu, trnh by hnh nh... Mt diu cn lu na l cm quan (look and feel) hay phong cch hin giao din ha ca mi h li c nhng c trng ring ca mnh, n c chng hn vi tng giao din thng thng mon control) nh nt nhn (button), danh sch (list) ... mi mi trng Windows li c cch v nhng i tng trn theo hnh ring ca mnh.Cc hm API m my o Java (thng qua cc lp th vin) s cung cp cho ta nhng chc nng ha thng thng nht m c h Windows no cng phi c. Khi s dng cc hm ha ca Java, ta s khng phi quan tm n cc hm API c th ca mi trng na, my o Java v cc lp th vin h tr s gip chuyn i cc hm API tr nn thch hp vi mi h diu hnh, dng ca ta vit trn mi trng Microsoft Windows s c phong cch (style) ca Microsoft (nh cch v cc nt nhn, ca s ...), khi chy trn h Windows Solaris s mang phong cch ca Sun, hay trn OS/2 s mang phong cch ca IBM ...Sun gi cc hm API ca ngn ng Java c thit k mc tru tng (hay tng qut ha thch nghi vi nhiu h iu - multiplatform) l AWT. Lp th vin AWT m ta nghin cu mt phn chng trc ch cp n cc i tng giao ha thng thng (common control) nh nt nhn (button), nh du (checkbox) , vn bn (TextField)... Phn ta s nghin cu cc chc nng ha ca Java mc thp hn (low level), nh k tng ng thng, v tng dim nh, thit mu sc ... Tt c nhng chc nng ny thng tp trung vo i tng ha Graphics m ta cng tng bit n qua cc ng trnh trc (t ra i tng Graphics vn thng c th hin trong phng thc paint (Graphics g)).By gi ta s bt u i vo chi tit cc thnh phn d ha.PHN BIT PHNG THC PAINTO, REPAINTO V UPDATE0Nh cc chng trc tng vit cho Applet, mun Applet v ra c mt ci g thng ta phi ci dt phng thc " nt cho lp Applet nh sau:public void paint (Graphics g) {>Tt c hnh nh mun v ta u phi dng n i tng Graphics g, tng Graphics ta nh mt cy c sn "t ln Applet. Bt c khi no Applet cn thit phi c ti to li n u gi n phng thc paint () v li hnh nh.Tuy nhin, khng nht thit lc no cng phi gi n paint () bi v vic thc hin tt c cc thao tc bn trong phng paint () s t ra chm chp nu nh ta gi n lin tc. Phng thc repaint () thng dc dng phc v cho thao tc ta cn thc hin v li, thay v gi trc tip n paint () ta c th gi repaint () (chnh xc th phng thc repaint () update () sau gi tip n pant ()). Nu ch mun v ii mt phn ca khung hnh ta hy s dng phng thc : public void repaint (int X, int y, int width, int height)Phng thc ny nhn ta gc bn tri trn cng X, y cng vi kch thc width, height v chiu rng v chiu cao vng ch nht m ta cn v li. N lm tng tc cho nhng chng trnh x l hot hnh (animation) nht l tnng trng hp

m 116Chng 6 : i tng ha (Graphic;rhncn cp nht nhng vng v tng di nh khng nh hng n cc vng khc (nu ta gi phng thc paint () hay repaint (th ton b nh s c v li, khi x l nhanh v lin tc tnh trng ny s gy ra hiu ng lm nh b chp git nhn khng c :nhin).Thng th phng thc repaint s gi tip n phng thc update. Phng thc update c nhim v dng mt dtng ha Graphics thc hin mt s thao tc cn thit nh xa sch vng cn v li, t mu nn, mu ch mc nh cho c;tc v ha ... sau chuyn giao i tng Graphics ny cho hm pant v gi paint thc hin cc nhim v cn li.3. LP GRAPHICSLp Graphics ca th vin AWT cung cp cho ta mt s phng thc v c nhng hnh ha c bn nh :LinessV 'r.:nsng thng Vng trn v Elip Hnh ch nht v a gic Hnh nhVn bn vi cc Font ch khc nhauCircle v Ellipes(Rectangle v Polygon)ImageText v FontVi Java 1.4 ta cn c thm cc di tng ha dc sc t lp th vin Graphics2D v Graphics3D.l4. H TA Mn hnh m ta hin thy c m phng nh mt h ta7. V ]L.ch v kcolea k:.i: hai h v r&Ta gc trnTa gc dtHnh 6-1

phng Descartes gm cc im (x,y). iu lu l trc tung cah ta ny hng xung, gc tri trn cng ca mn hnh ctnh l (0,0). Ta d cc im tng dn t tri qua phi v t trnxung di. Ta ln nht c th c c nm gc tn cng bnphi ca mn hnh v ty thuc vo phn gii ca mn hnhm c th mang cc gi tr khc nhau, chng hn vi mn hnh c phn gii 640x480 th ta ny l (640,480) cn vi phngii 800x600 th s l (800,600).5. K NG THNGPhng thc c bn nht ca i tng ha Graphics dng v mt ng thng tht dn gin:public void drawLine (int xl, int yl, int x2 , inty2)Ta dng phng thc ny v mt ng thng dc to ra t hai im trn h ta mn hnh l (xl,yl) v (x2,y2). D_dy l kt qu ca chng trnh v dng thng.V d 6-1: DrawLinesjavaimport j ava. applet. * ;import j ava. awt. * ;public class DrawLines extends Applet {public void paint (Graphics g) {g.drawLine(0,0,200,100);g.rawLne{20,12 0,2 50,120);}}Hnh 6-26. V HNH CH NHT (RECTANGLE)V mt hnh ch nht (hay hnh vung) i hi ta phi bit ta (x,y) gc tri trn ca hnh ch nht cng c chiu rjwidth v chiu cao height ca n. Nhng phng thc sau s gip ta v hnh ch nht vi cc dng khc nhau :public void drawRect (int X, int y, int width, int height)Phng thc ny v mt hnh ch nht vi ta dnh gc tri (x,y) vi chiu rng width, chiu cao height. V d dhnh ch nht ta (10,20) rng 200 pixel cao 150 pixel ta thc hin lnh sau : drawrect (10,20,200,150) .Nu nh mun v mt hnh ch nht c t m bn trong hy dngphng thc:public void fillRect (int X, int y, int width, nt height)Cn phng thc sau s dng xa mt vng ch nht:public void clearRect (int X, int y, int width, int height)Di y l kt qu ca chng trnh v hrih ch nht theo 3 phngthc khc nhau:V d 6-2: DrawRectagle javaimpor*-. java.applet.*;import j ava. awt. * ;public class DrawRectangle extends Applet {public void paint (Graphics g) {//V hnh ch nht :h c vin khungg.dnwAect (10, 10, 30, 30) ;11 V hnh c.li nht c t bn trong du 6-.s.d - *8- \THnh 6-3lfe_V: iu

Chng 6 : i tng ha (Graphics)117g.fillRect(50,10,30,30);I/ /V hnh ch nht khc cng c t bn trongg.fillRect(90,10,30,30);i Xa mt phn hnh ch nht tg.clearRect(100^20,10,10);>|)Tht ra kt qu trong chng trnh ny ta nhn c l hnh vung bi v cc cnh ca hnh ch nht u bng nhau.1. V HNH CH NHT 3 CHIU (3D RECTANGLE)Lp Graphics cung cp cho ta cch v hnh ch nht 3 chiu (3D) ta nh nhng nt nhn (button) m ta vn thng thy,ch v hnh ch nht 3D khng khc g cch v hnh ch nht bnh thng ch c iu ta cn cho bit thm mt i s kiuDolean d xc nhn xem hnh ch nht s dc v theo dng 3D no. C hai cch v, mt s lm cho tng ni ln (raised)lc hai s lm cho ' tng c v nh chm xung. Hy hnh ung nh c mt ngun sng xut pht t bn gc tri trn ca mnnh v ri xung i tng 3D ca ta.Sau dy l hai phng thc v hnh ch nht 3D:/ Ch v hnh ch nht 3D. Khng t bn trongpublic void raw3DRect (int X, int y, int width, int height, boolean raised)I /V hnh ch nht 3D v t bn trongpublic void fill3DRect (int X, int y, intwidth,int height,booleanraised)Nu raised=true hnh ch nht s dng ni cn raised=false hnh ch nht s dngchm.r< d 6-3: DrawRect3D java?ort j ava. awt. *; 1nport j ava. applet. * ;3lic class DrawRect3D extends Applet {public void paint (Graphics g) {I/t mu v trng vi mu nng.setColor(getBackground());I / V hnh ch nht nig.draw3dRect(10, 10, fi0, 40, true);f / V hnh ch nht chm khng c t bn trongg.draw3dRect(10O/'IO, 60, 40, false);\|/ / V hnh ch nht nic t bn trongS.fill3Rect(X0, 80, 60, 40, true);|/ / V hnh ch nht chm c t bn trongg.fill3dRect(100, 80, 60, 40, false);} _|}Kt qu nh hinhf 6-4 bn|8. V HNH CH NHT TRN GC (ROUND RECTANGLE)Ngoi cch v hnh ch nht bnh thng v hnh ch nht 3 chiu ta cn c th v hnh ch nht c cc gc vt bu (round[rectangle). Hai phng thc drawRoundRect v fHRoundRect cng t.ng t nh drawRect v fillRect ngoi trI chng nhn thm 2 i s khc nh sau:i I V hnh ch nht trn gc khng c t bn trongpublic void drawRoundRect (int X, int y, int width,int height, int arcWidth, int arcHeiht)! / V hnh ch nht trn gc c t bn trongpublic void f illRoundRect (int X, int y, nt width,int height, int arcWidth, int arcHeight)Cc i s arcVidth v arcHeight ch nh cong ca gc theo\chiu rng v chiu cao. V d ta qui dnh arcWidth=15, arcHeight = 10th cc gc ca hnh ch nht s c un cong nh hnh 6-5:Di y l chng trnh v ra Applet cc hnh ch nht trn gc:V d 6-4: DrawRoundRectJavaimport j ava. awt. * ; import j ava. applet. *; public class DrawRoundRect extends Applet{ public void paint (Graphics g) {/' / V hnh ch nht trn gc vi arcWidth=20, arcleight=20 khng t / / bn trong g.drawRoundRect (10, 10, 40, 50, 20, 20);Hnh 6-4

Chng 6 : i tng ha (Graphic-11 V hnh ch nht trn gc t bn trong vi arcWdth=10, rcHeight=6 g. fillRoundRect (10, 80, 40, 50, 10, 6) ;>}Kt qu nh hnh 6-6:

Hnh 6-6

height9. V VNG TRN V HNH ELLIPVng trn ch l trng hp c bit ca hnh Ellip, lp Graphics ca Java cungcp cho ta phng thcdrawOvalfillOval dng v va vng trn va ellip, hai hnh ny gi chung l hnh bu dc(Oval). Cng nhvicchnh truf illOval dng t y bn trong ca hnh.//V mt hnh Oval(x11Phng thc x l kh nng tr hon ca phn tuyn vi thi gian chi nh miliSeconds (phn ngn giy )private void delay (int miliSeconds) {try {Thread.sleep(miliSconds);} catch (Exception e) {System.out.println("Sleep error !");>}//Phng thc x l kh nng di chuyn ca qu banhprivate void moveBall () {/ /Nu banh ang di chuyn t tri qua phi th cng 1 vo bc di chuynif (ballDirection == 0) {balix++;//Bin phi l 100, nu banh ng bin ph th ta di hng di chuynif (balix > 100) {ballDirection =1;balix =100;} else {/ /Banh ang di chuyn t phi qua tri, tr 1 vo bc di chuynbalix--;/ /Nu banh ng bin tri thi i hng ngc lii (ballx Bin dch:C: \Learning>javac BallAnimation. javaSa i tp tin MyApplet.html:

Chy chng trnh:c: \Learning>appletViewer MyApplet. html

Chng 6 : i tng ha (Graphics)127Hy n s thay i vng sng ca tri banh khi n di chuyn qua hnh cha nht. Chng trnh ny do ta khng ci t phng thc update nn mi khi repaint () dc gi ton b nn ca Applet s b xa v nh c v li t u. Chnh v th mc d t ch v l XOR hnh ch nht ca ta vn khng mt i khi c v li cng mt v tr. Hiu ng xy ra khi vng trn i ngang Qua hnh ch nht, phn giao nhau ca hai hnh v u l mu en cho nn khi v ra ta s thy chung mang mau trng.16. V HNH NH (IMAGE)1.1. V nh vo AppletLp Graphics cung cp cho ta phng thc drawlmage v mt nh ra mn hnh. Ta c th s dng cng mt phng thc ny vi nhiu cch khc nhau, hu ht cc cch v u nhn i tng Image lm i s (y c xem l ngun d liu nh) cng vi mt tng thuc lp ImageObserver lm quan st vin theo di qu trnh np v v nh.Tin trnh d v mt nh xem ra khng n gin l ch cn c nh t tp tin ri thc hin vic hin th n ra mn hnh. i vi nhng nh kch thc ln, hay vic truyn ti d liu nh din ra trn mng (vn thng hay b than phin v tc ) th vn d kim sot qu trnh np v x l nh l ht sc cn thit. Khi ta gi phng thc drawlmage v nh th cha chc d liu ca i tng Image m ta truyn cho phng thc ny c sn. c th hnh nh vn ang c c t mt a ch my ch xa xi Bo d trn mng. Phng thc drawlmage khng v vy m ngng tr hay tr hon cc thao tc khc cn thit cho chng trnh ca ta. Chnh v th n mi cn n i tng Image Observer. tng ny chu trch nhim kim tra xein nh sn sng v hay cha ri mi chuyn giao cho phng thc drawlmage. Lp ImageOserver ch l mt lp giao din (interface) ta khng ' dng n to ra i tng dc, tuy nhin bn thn Applet d ci dt (implements) cho giao din ny nn chnh Applet cng c4 c xem nh l mt i tng ca ImageOserver, v th v mt nh bng phng thc drawlmage trong Applet ta vn y dng cch sau:public void pait (Graphics g) { g.drawlmage(Image,0,0,thi s) ;}this y chnh l bn thn Applet c xem nh l i tng Image Observer Di dy l nhng cch dng khc nhau ca phng thc drawlmage: public boolean dr awlmage (Image img, int X, iht y, ImageObserver observer)V nh v tr x,y.public boolean drawlmage (Image img, int X, int y, int width, int height, ImageObserver observer)V nh v tr x,y vi chiu rng width v chiu cao height. Anh s c co gin cho va vi kch thc width, ight m ta ch nh.public boolean drawlmage (Image img, int X, int y. Color bgcolor, ImageObserver observer)V nh v tr x,y. i s bgcolor xc nh mu no s c dng th hin d trong sut (transparent) ca nh. public boolean drawlmage (Image img, int X, int y, int width, int height. Color bgcolor,ImageObserver observer)V nh v tr x,y vi chiu rng width v chiu cao height. nh s c co gin cho va vi kch thc width, height m ta ch nh, bgcolor l mu th hin mu trong su't (transparent) ca nh. public boolean drawlmage (Image iing, int dxl, int dyl, int dx2, int y2,int sxl,int syl,int sx2,int sy2, ImageObserver observer)Ch ly mt vng nh nm trong hnh ch nht c ta d (sxl, syl) (sx2, sy2 ) v ln mt vng ch nht ca mn hnh c ta (dxl, dx2 ) , (dyl, dy2). public boolean drawlmage (Image img, int dxl,int dyl,int dx2,int dy2,int sxl,int syl,int sx2,int sy2. Color bgcolor, ImageObserver observer)Tng t phng thc drawlmage th 5 trn nhng thm vo i s bgcolor xc nh mu trong sut ca nh v.Di y l v d minh ha:V d 6-15: DrawImageAppletJava\import j ava. awt. *; import java.applet./ / Applet dng v anil ly t tp tin eagle.gifpublic class DrawImageApplet extends Applet { Image img; public void init () {/1Np nh t th mc hin hnh ni cha Appletimg=getImage(getDocumentBase(),"eagle.gif");>public void paint (Graphics g) javac DrawImageApplet. javaSa i tp tin MyApplet.html:

Chng 6 : i tng ha (Graphics)Chy Applet bng Internet Explorer:Phng thc getDocumentBase () ca Applet tr v dng dn hin hnh ni cha Applet. Thng th cc tp tin hnh nh c t chung mt th mc vi th mc hin hnh ca Applet. Trong trng hp cc hnh nh dc lu trong th mc con ca th mc cha Applet th ta phi thm vo ng dn tng di d ch n tp tin ny, v d ta c Applet v tp tin hnh nh tiger. jpg c t v tr:-S Learningay DrawlmageApplet class 5 DrawlmageApp. class Picturefltiger.jpgTa phi ly nh bng cch sau: img=getlmage(getDocmentBase(), "pictuxe/tiger.jpg");Lu :Nu mun dng du s phi \ nh ng dnthng thng ca DOS th ta phi dng hai du \\" ("picture \ \Bagle.gif") bi Java cng nh C/C++ dng du s phi 'V cho nhng k t iu khin.'3C:\Learninq\MyApplets\Myflpplet.hl:fnt - Microsoft F1BWNe td* View f-avoti-w Tods Ht'pAddress jjil c:\Lear ninqt.My AppletsI.My Applet, hi: n>T If"LinksM^;pp|t^|tmgftppk(" i' ?'i '"g; ^^SmvSmHnh 6-151.2. V nh vo ca s ng dngi vi mt ng dng dc lp (Standard alone application) ta vn c th dng phng thc drawlmage v nh ra ca sing dng. Tuy nhin phng thc np nh c hi khc, ta phi s dng phng thc getlmage ca i tng Toolkit (ta icp dn i tng Toolkit ny phn ni v Font ch). Toolkit l mt di tng dng ly hay x l ti nguyn my ccb. Minh ha di s v nh t tp tin eagle . gif vo ca s ca ng dng.V d 6-16: DrawImageAppJavaimport j ava.awt.*;iiiport j ava. awt. event. * ;/ /Dy l chng trnh c lp dng v nh ra ca s. Ca s ng dng c to ra t khung cha Frame.public class DrawImageApp extends Frame{Image img;public DrawImageApp(String title) {super(title);/1 Ly nh bng i tng Toolkitimg=r7etToolkit () .getlmage ( "tiger. jpg") ;>/ / Chng trnh chnh, khi to v hin th ca s ng dngpublic static void main(String args u } {DrawImageApp myWindow =new DrawImageApp ( "Image Application" ) ;myWindow.addWindowListener(newWindowAdaptfr r(){public void windowClosing(WindowEvent event) {System.exit(0);}}) ;myWiiidow. setsize (new Dimension (200, 200));myWindow.show();>/ /Ci t phng thc paint v nh vo khung chapublic void paint (Graphics g) {/ /V nh vo ca sg.drawlmage(img,0,0,this);}}Bin dch:c: \I^5arning> j avac DrawImageApp. j avaChy chng trnh:C:\Learning> java DrawImageApp

Hnh 6-16

Chng 6 : l tng ha (Graphics)129Anh m ta v dc hon ton nm trong mt ca s ng dng ring bit, khng phi nh vo trang WEB no c. Cch v nh vo Applet v vo ca s ng dng l hon ton ging nhau (ch khc cch np nh m thi, vi ng dng ta phi nh n i tng Toolkit). Vi tng ImagObserver cn truyn cho phng thc drawlmage ta cng s dng bin this l mt th hin ca khung cha Frame. Frame l mt thnh phn AWT m mi thnh phn AWT u c Java ci t giao din (interface) ImageObserver cho nn ta c th coi cc thnh phn AWT nh l mt i tng ImageOserver s dng cho phng thc drawlmage.Nu bn qun cch to ra mt ng dng c lp (standard alone application) hy xem li chng 2.17. THEO DI TIN TRNH NP NH BANG LP MediaTrackerImageObserver c coi l mt nh quan st vin theo di qu trnh np nh vo b nh. Tuy nhin, nu lm vic trc tip t lp ny th khng thun tin lm bi lp ny ch l mt giao din (interface), mun s dng dc ta phi thc hin vic ci t (implements) cho n. Java cung cp cho ta lp MediaTracker c xv dng da trn lp ImageObserver, nhm gip ta d dng theo di tin trnh np v x l nh. to ra i tng MeiaTracker ta dng phng thc khi dng sau ca lp: public MediaTracker(Component comp)I s comp l mt thnh phn AWT m ta mun theo di tin trnh np nh t . Thng th chnh Applet cng l mt thnh phn AWT nn ta c th s dng bin this lm i s truyn cho phng thc ny (i vi ng dng c lp th bin this chnh l th hin ca i tng khung cha Frame m ta ly lm ca s ng dng)V d sau s to ra mt di tng MediaTracker :MediaTracker myTracker= newMediaTracker(this) ;By gi nu ta c mt nh v mun np n vo i tng Image nh sau:Image img=new Image ( "java. gif") ;Khi thc hin dng lnh ny cha chc i tng img ca ta c d liu np y nh vo b nh. Chnh v vy ta mi phi nh n i tng MeiaTracker theo di tip xem qu trnh c nh t tp tin dang c din ra nh th no, phng thc d buc di tng MeiaTracker theo di mt nh ang np l: public void addlmage (Image img, int id)i s id gip MediaTracker phn bit c nh hay mt nhm nh no ang c theo di. Ta c th s dng cng mt s id cho nhiu nh khc nhau. Trng hp mun nh np vo trc khi chm dt cn co gin (scale) theo chiu rng width v chiu cao height do ta ch dnh hy dng phng thc sau:public void adlmage (Image img, int id, int w, int h)V d sau s nh MediaTracker kim sot qu trnh np bc nh " java .gf" c to ra trn: myTracker.addlmage(img,0) ;Mt khi nh i tng MediaTracker theo di qu trnh np nh, ta c th iu khin nh c np li hoc ch cho n khi nh np xong ri mi thi hnh tip cc thao tc khc, phng thc waitForlD s thc hin iu : public void waitForlD (int id)i s' id chnh l nh danh ca bc nh hoc mt nhm nh m ta nh i tng MediaTracker theo di bng phng thc addlmage trn. waitForlD s tm dng chng trnh ca ta cho n khi nh c np y vo b nh, lc dng lnh k tip ca ta mi dc thc thi.Mt i tng MediaTracker c th theo di tin trnh np nhiu nh vi cc nh danh id khc nhau. Nu ta mun ch cho tt c cc nh dc np vo b nh trc khi chng trnh c tip tc hy gi phng thc: public void waitForAll ()Mt kh nng khc na l nu ta ch mun ch i qu trnh np nh din ra trong mt thi gian ti a no m thi, qu thi gian qui nh ny cc lnh tip theo ca chng trnh s din ra tip tc. Hai phng thc waitForlD v waitForAll cng s cung cp cho ta kh nng ny mt dng khc l:public void waitForlD (int id, long ms) ; public void waitForAll (long ms) ; ms l khong thi gian tnh bng phn ngn giy m hai phngthc ny s chiqutrnhnpnhchm dt.B't c khi no ta mun bit xem trng thi np nh angdinranduhygiphngthcstatus ID hocStatusAll: public nt statusID(int id, boolean startLoading) public int statusAll (boolean startLoading)Phng thc statusID dnh cho mt hay mt nhm nh c nh danh id cn phng thc statusAll dnh cho tt c cc nh m i tng MeiaTracker ang theo d. C hai phng thc ny u c i s startLoading kiu boolean, nu ta t startLoading=true th trng hp nh cha c sn n s c khi dng np vo. Trng thi m hai phng thc ny tr v s mang cc tr sau:MediaTracker .ABORTED I Qu trnh np b hy b MedaTracker .COMPLETE / /Qu trnh np kt thc ttpMeiaTracker.LOADING11ang np nhMediaTracker .ERRORED11Qu trnh np nh b liThay v dng phng thc statusID hoc statusAll d kim tra mi trng thi np nh, ta c th chi cn dng phng thc checklD hav checkAll xem nh c np hon tt hay cha m thi. Cc phng thc ny nh sau: public boolean checkID(int id) public boolean checkAll ()public boolean checkID(int id, boolean startLoading)CheckID kim tra mt nh hay mt nhm nh vi nh danh id CI1 checkAll kim tra ton b nh m i tng MediaTracker ang theo di. Tr tr v l true nu nh c np hoa.'i tt , false nu c li xy ra trong qu trnh np

130Chng6:itngha(Graphics)hoc nh cha np xong. Cng nh statusID v statusAll, i s startLoading ca hai phng thc checklD v checkAll nu c tr bng true s khi ng qu trnh np nh vo b nh nu n cha c np.Nh vy hai cch kim tra v xem nh c np vo b nh hay cha sau y l nh nhau: if (myTracker.checkAll()){/ /X l nh d np xong}hay:if (myTracker.statusAll()==MediaTracker.COMPLETE)/ /X l nh d np xong>Di y l v d Iiinh ha cho cch s dng i tng MeaTracker. Ta ly nh t tp tin " java .gif" sau th ch n 10 giy sau mi thc hin np v v nh:V d 6-17: ImageTrackerApplet.javaimport Java.applet.*; import j ava. awt. *;public class ImageTrackerApplet extends Applet implements Runnable {Thread myThread;MediaTracker myTracker;Image image; int timeCount = 0;String status=Loading public void inito {//To i tng MediaTracker theo di qu trnh np nh ca Applet myTracker=new MedaTracker (this) / /Ly nh t tp tinimage=getImage(getDocumentBase(),"java.gif");//Dng i tng Mei&Tracker d theo di tin trnh np nh. nh danh ca nh cn theo di l d=0 myTracker.adlmage(image,0);>/ /Phng thc paint dng v nhpublic void paint (Graphics g) {/ / Kim tra xem nh c np xong hay cha, nu xong th v ra if (myTracker.checklD(0)) { g.drawlmage(image,0,15, this);}/ / Nu cha xong th hin ra cu thng bo else {g.drawstring(status,10,10);g.drawstring( "Image loaded after 10 seconds", 10, 60);>>/1 Vng lp trong phng thc ny s tr hon qu trnh np nh trong 10 giy public void run() { while (true) { timeCount++; if (timeCount==10) {1110 giy tri qua by gi th np nh vomyTracker.checklD(0,true);>repaint();/ / Trng thi cho bit s giy tri qua status=status+" . delay(1000);}}public void start () { myThread=new Thread (this); myThread.start() ;>public void stop () { myThread.stop(); myThread=null;}//Dng chng trnh li trong mt thi gian

Chng 6 : i tng ha (Graphics)131 1Mpublic void delay(int seconds) {try {Thread.sleep(seconds);Jcatch (Exception e) {System.out .println( "Sleep error" ) ;}>>Bin dch:c: \Learning> j avac ImageTrackerApplet. j avSa di tp tin MyApplet.html:

Chy chng trnh:Hnh617c: \Learning>appletViewer MyApplet. htmlKhi Applet bt u chy ta s thy dng ch trn, sau khong 10 giy (10 du chm s xut hin dng ch trng thi "Loading") th nh mi c v ra mn hnh. Nh mt bi tp hy th dng cc phng thc khc nh stausID hay waitForlD xem sao.18. CC I TNG TIN CH KHC CA LP GRAPHICSTh vin AWT cha ng rt nhiu cc i tng tin ch khc, tuy khng trc tip thc hin chc nng ha nhng chng li gip ch rt nhiu cho cc hm ha (chng hn nh i tng a gic Polygon m ta va nghin cu phn trn). Cc i tng cn li khc m ta cng nn bit qua l Point. Dimension v Rectangle.1.1. Lp PointPoint l mt i tng biu din cho im ta (x,y). rt nhiu phng thc trong th vin AWT dng v tr v i tng kiu Point. Ta c th to ra di tng Point bng cc phng thc khi dng ca lp Point nh sau:/ ITo ra mt im c ta x,ypublic void Point (int X, int y)//To ra mt im rng (ta c th ch nh ta x,y sau ny) public void Point ()11 To ra im t 1 im khcpublic void Point (Point p)V d sau s to mt im p c ta (5,10) :Point p=new Point (5,10), truy xut hoc thay i ta d ca mt im c th dng cc thnh phn X, y ca i tng Point (vi v d trn p.x= 5 v p.y =10). Mc d vy ta vn c th dng cc phng thc h tr ca lp Point thay i ta (theo ng tinh thn ca ngn ng hng di tng l hn ch truy xut cc bin trong lp). Phng thc move s thay i ta im cn phng thc translate s dch chuyn im n mt v tr tng di khc so vi v tr hin ti: public void move (int newX, int newY) public void translate (int xChange, int yChange)V d thay di ta im p(5,10) trn thnh im c ta mi l (20,45) cc lnh sau s cho cng mt kt qu://Gn trc tip vo cc bin thnh phn x,y ca i tng Point p.x=20; p.y=45;/ / Thay i im n ta mi p.move(20,45);I Di chuyn tang i so vi v tr ban u l (5,10) p.translate(15,35);1.2. Lp DimensionNu Point biu din cho mt dim trn ta mn hnh th Dimension l i tng dng biu din kch thc v chiu rng (width) v chiu cao (height) cho mt vt th. Ta c th to ra i tng Dimension bng cc phng thc khi dng ca lp Dimension nh sau://To ra i tng Dimension biu din kch thc rng width v / / cao heihtpublic Dimension(nt width, int height)11To ra i tng Dimension t mt i tng Dimension khc public Dimension (Dimension otherDimension)/ /To ra i tng Dimension biu din kch thc rng public Dimension{)Mun truy xut cc thnh phn kch thc ca i tng Dimension ta c th dng trc tip n cc bin sau ca lp: public int width public int heighti tng Dimension ny c dng kh nhiu cc chng trc, chng hn mun t kch thc rng 150 cao 200 cho mt khung cha Frame ta thng gi phng thc setsize nh sau: myFrame . setsize (new Dimension (150,200));

132Chng 6 : i tng ha (Graphics)1.3. Lp Rectanglei tng Rectangle th hin mt hnh ch nht, c th coi y l s kt hp caPointvDimension.Hnh ch nhtthng c biu din bi ta gc tri trn cng vi chiu rng v chiu cao. Cc phngthckhidngt lp Rectanglesauy s gip ta to ra mt i tng biu din hnh ch nht:/ / To ra hnh ch nht c kch thc d. v ta gc tri trn l p public Rectangle (Point p, Dimension d)/ / Thay v dng cc i tng p v Dimension nh phng thc trn ta c th ch nh r ta gc tri trn x,y cng viII chiu rng v chiu cao width, heightpublic Rectangle (int X, int y, int width, int height)// To hnh ch nht vi chiu rng width, chiu cao height ta gc tri trn l (0,0) public Rectangle (int width, int height)/ To hnh ch nht vi kch thc d c ta gc tri trn l (0,0) public Rectangle (Dimension )/ / To hnh ch nht vi kch thc c ta gc tri trn l p kch thc chiu di v chiu rng bng 0 public Rectangle (Point p)/ /To hnh ch nht t mt hnh ch nht khc public Rectangle (Rectangle r)Ta c th truy xut cc bin ca lp Rectangle ly v t lai cc thng s' cho i tng hnh ch nht:public int X public int y public int width public int heightMun thay i ta gc tri trn ca hnh ch nht ta c th dng phng thc move v translate nh d hc vi lpPoint:public void move (int newX, int newY) public void translate (int xChange, int yChange)Mun thay i kch thc chiu rng v chiu cao ca hnh ch nht ta c th gi mt trong hai phng thc sau:/ nh li kch thc width, height cho hnh ch nhtpublic void setsize (int width, int height)/ /Tng kch thc width, height cho hnh ch nht ln I v public void grow(int h, int v)Thng th nu va mun nh v tr v kch thc cho hnh ch nht ta nn gi phng thc setBounds: public void setBouns (int X, int y, int width, int height)Cc phng thc sau b sung mt s kh nng khc cho i tng Rectangle:/ / Xc nh xem im p c nm trong hnh ch nht hay khng public boolean contains (Point p)/ / Xc nh xem hnh ch nht hin ti c giao vi hnh ch nht khc hay khng public boolean intersects (Rectangle r)// Ly phn giao ca hnh ch nht hin ti vi mt hnh ch nht khc public Rectangle intersection (Rectangle r)/ / Ly phn hp ca hnh ch nht hin ti vi mt hnh ch nht khc public Rectangle union (Rectangle r)19. LP COLOR TH HIN M SACNu bit v hi ha (hay t ra cng tng hc t mu bng bt ch) chc hn ta cn nh 3 mu c bn l (red) vng (yellow) v xanh dng (blue). Nhng mu c bn ny thng c pha trn vi nhau to ra cc mu khc. Chng hn nu ly mu pha vi mu vng th s c mu cam, cn mu xanh pha vi mu s ra mu hng ...Mu en l tp hp ca tt c cc cht mu trn li.Vi my tnh, mu sc cng c biu din tng t nh vy nhng c hi khc mt cht. Ba mu c bn c my tnh th hin l d (Red), xanh l cy (Green) v xanh dng (Blue). Mt im nh mu (pixel) trn mn hnh m ta thy c chnh l s kt hp ca 3 mu ny trn li vi cc sc khc nhau, sc mang cc gi tr t 0-255 (chim 1 byte), sc xanh l cy v xanh dng cng vy. My tnh kt hp 3 sc mu ny li (tng cng l 3 byte) th hin gi tr ca mt mu trn mn hnh. Thng mu sc dc biu din theo cch ny dc gi l mu RGB (mu sc c to ra t 3 mu Red Green Blue). (Chng sau ta s nghin ci 'i hn v cc m hnh mu sc v cch x l nh da trn nhng m hnh ny).Vi Java ta c th t mnh to ra mu sc theo mun bng di tng thuc lp Color. Mun to ra 'i tng Color ta cn cung cp cho phng thc kh dng ca lo ny cc thng s v sc Red, Green v Blue tng ng. Di y l sc RGB ca nhng mu c bn m tH vn thng dng: i tng CoorRedGreenBlue

Color.white255255255

Color.lijihtGray192192192

Col or.gray ..128-128128

Chng 6 : i tng ha (Graphics)133 BColor.darkGray646464

Color .black000

Color .red25500

Coor.pink255175175

Color.orange2552000

Color.yellow2552550

Color.ifreen00255

Color .magenta2550255

Color .cyan *0255255

Color .blue00255

Mu hng c gi tr mu l Oxffafaf (tng ng vi R-255. G-175. B-175)i tng Color c th c to ra bng nhiu cch. Nu d bit 3 sc RGB ca mu cn to ta c th gi phng thckhi dng sau ca lp Color:public Color(int red, int green, int blue)V d mu hng (pink) c th c to ra theo cch sau:Color inyPink=new Color (255, 175, 175)Nu mun dng sc mu theo t l % hy s dng phng thc khi dng khc ca lp Color l:public Color (float red, float green, float blue)i s red, green, blue s mang cc gi tr t 0.0 - 1.0 (tng ngvi t l0-100%).Vd to ra i tng Colormang mu cam (orange) ta c th' vit nh sau:Color myOrange=new Color (1. 0, 0.78 , 0)(tng ng vi thnh phn Red=100%, Green=78% v Blue=0%)Nh cp d trn, gi tr mu l s kt hp ca 3 sc RGB, mi sc chim 1 byte c tr t 0-255 (tng cng l 3byte cho mt tr mu). Thc t gi tr mu c xem nh mt bin kiu int (4 byte). Cc thnh phn RGB s c cha trong 3 byte,byte cn li dng cha gi tr alpha th hin d trong sut (transparent) ca mu (ta s c dp xem xt thnh phn alpha ny chng sau). H RGB mc nh ca Java dt tr alpha l 32.Do cch b tr mu nh trn nn ta c th to ra i tng Color t 1trmu kiuint bng phngthc khi dng sau:public void Color (nt rgbValue)V d to ra i tng mu hng ta c th lm theo cch sau:Color myPink=new Color (Oxf fafaf) ;hu :Khi th hin tr mu bng c s 16 (hex) ta s thy r hancc thnh phn RGB ca n.Mt khi c i tng mu Color, mun p dng n v tach vic gi phng thc setColor (Color c) ca i tngGraphics, on m di dy chng hn s v ra mt vng trn mangmu hng:public void paint (Graphics g) {//To i tng Color mang tr mu hngColor myPink=new Color (255, 175, 175) ;/ /p dng mu hng v vng trng. setColor(myPink) ;g.fillOval(10,10,50,50);>Vi mt i tng Color b"t k mun bit dc cc thnh phn RGB ca n ta c th dng cc phng thc trch mu sau:public intgetRe ()//Ly ra tlinh phn sc dpublic intgetGreen ()//Ly ra thnh phn sc xanh l cypublic intgetBlue ()//Ly ra thnh phn sc xanh dngV d:Color myPnk=new Color(255, 175, 175);int R=myPink. getRed () ; I Tr vtr255int G=myPink.getGreen() ;/ /Tr vtr175int B=myPink.getBlue () ;//Tr vtr175Di dy l chng trnh minh ha. Ta v ra tt c cc mu c bn ca lp Color v cho bit cc sc RGB ca chng:V d 6-18: ColorValueApplet.javaimport j ava. awt. *;import java. applet. Applet;public class ColorValueApplet extends Applet {/ /Danh sch cha tn cc muString[] ColorName={"black","blue","cyan","darkGray","gray","green11,"lightGray","magenta", "orange","pink","red","white", "yellow"};//Danh sch cc i tng mu ca bn m lp Color c sn

Tr mu A byte kiu intHnh 6-18

Chng 6 : i tng ha (Graphics)Color [] Cclorltem = {Color.black,Color.blue, Color.cyan.Color.darkGray,Color.gray. Color.green.Color.lightGray,Color.magenta.Color.orange, Color.pink,Color.red.Color.white,Color.yellow};public void paint (Graphics g) {I /In ra tt c cc mu trong danh schfor (int i=0; ijavac ColorValueApplet. javaSa i tp tin MyApplet.html:

public void paint (Graphics g) {//i cc tr trong vn bn TextFiel thnh cc gi tr stry {R=Integer.parselnt(reValue.getText());G=Integer.parselnt(greenValue.getText()};B=Integer.parselnt(blueValue.getText());} catch (NumberFormatException e) {System.out.printIn("Error color value");} iTo ra mu mi v dng n v hnh ch nhtg.setColor(new Color(R,G,B) ) ;g.fillRect(50,50,100,50);>}Bin dch:C: \Learning> javac ColorSettingApplet. javaSa i tp tin MyApplet.html:

Applet Viewer: ColorSetting... 13

Applet started.

Chy chng trnh:Hnh6-20C: \Learning>appletViewer My Applet .htmlnh cc tr khc nhau vo 3 vn bn ri nhn nt "update" ta s c cmt mu mi do chnh mnh pha trn. Hy th kim tra li vi cc gi tr mu c bnm Java cung cp (nu ta nh vo tr > 255 th Java s bo li Exception l gi trsc mu nh vo khng hp l).20. VNG CT (CLIPPING REGION)K thut ct (clipping) dc s dng rt nhiu trong ha. Chng hn i vica s, nu ta v mt ng thng vt qu phm vi chiu rng hay chiu cao cakhung ca s th phn d ra s khng c v.V d nu v ng thng AB v EF trong khung ca s th ch c on CD vEG l c v. cc don nm ngoi khung nh AC, DB hay GF u b ct b.Di tng Graphics cho php ta ci t mt vng ct nh th bng phngthc clipRect sau:Hnh6-21clipRect (int X, int y, int width, int height)Vi chng trnh minh ha di dy s cho thy kh nng l th khi p dng k thut ct ny. Tathit lp vngctlmthnh ch nht, sau v v cho mt phn ca vng trn ri vo vng ct. Hnh m ta thu c l phngiao ca vng trnv hnhch nht dng gii hn phm vi v:V d 6-20: ClipApplet.javaimport j ava. awt. * ;import java.applet.Applet;public class ClipApplet extends Applet {public void paint (Graphics g) {g.clipRect(18,31,103,55);g.fillOval(12,9,90,83);}}Bin dch:c: \Learning> javac clipApplet. javaSa i tp tin MyApplet.html:

Chy chng trnh:c: \Learning>appletViewer My Applet. html21. IN AN (PRINTING)Vi Java t phin bn 1.1 tr i ta c th thc hin thaotc in n nh a d liu, hnh nh ... ra my in. Lp Print Jobs thc hin nhim v ny. Mun c dc i tng thuc lpPrintJob ta phi nh n i tng Toolkit (di tngToolkit nv tng c cp n phn x l Font ch vv nh). Phng thc getPrintJob sau y ca Toolkit str v cho i tng Print Job:

Ktqu^Applet Viewer: ClipApplet.class PRBYVng ct (dip rectangle)

Applet startedHnh 6-22

136Chng 6 : i tng d ha (Graphics)public PrintJob getPrintJobtFrame parent, string jobName, Properties props)Chng trnh phi dng mt khung cha Frame mi c th' s dng c phng thc getPrint Job ny. Nu vit mt ng dng chy c lp (Standard alone application) thi Frame chnh l ca s ng dng. Trong trng hp ta mun in ra t Applet th bt buc phi to ra mt Frame rng. V d sau s ly v mt i tng Print Job t Applet thc hin cng vic in n:/ / To ra khung cha Frame rngFrame f rm= new Frame ()11 Ly i tng Print JobPrint Job myJob=getToolkit().getPrintJob(f nn, "JavaPrinter",null) c th in hay v ra giy ta gi phng thc getGraphics ca Print Job, phng thc ny s tr v cho i tng ha Graphics m ta vn thng hay dng v trong phng thc paint, thay v v ra my in. public Graphics getGraphics ()V d :Graphics g = myJob.getGraphics ()Nu mun bit kch thc trang giy in ra ta gi phng thc sau: public Dimension getPageDimension ()Sau khi in xong chng trnh cn hy i tng ha bng phng thc g. dispose (). Tip theo gi phng thc end () ca i tng Print Job d kt thc cng vic in n.Di y ta s s dng i tng Print Job in mt chui ra my in.:V d 6-21: PrintAppIet javaimport java.applet. *; import j ava.awt.*; public class PrintApplet extends Applet { public void init () {//To mt Frame rngFrame f=new Frame () ;/ I Ly i tng Print Job t thnh phn ToolkitPrint Job job=getToolkit().getPrintJob(f,"JavaPrinter",null);/1Ly i tng d ha dng v ra my in Graphics g=job.getGraphics() ;/ Un d liu ra giyg. drawstring ( "Hello World" , 50, 100);/1Hy b i tng ia g.dispose();/ IKt thc cng vc in n j ob.end();}}22. KT CHNG chng ny ta xem qua phn ln cc chc Iing ha ca Java thng qua i tng thuc lp Graphics. Ta bit cch v cc hnh c bn nh vng trn, ellip, ng thng, hnh ch nht, da gic ... Phng thc drawstring ca i tng Graphics gip ta v vn bn hay ch ra mn hnh. Va bn v ch c th c trinh by bng nhiu phng ch khc nhau. p dng phng ch cho vn bn ta s dng di tng Font v FontMetri.es. Phng thc drawlmage dng v nh ra mn hnh. Ta c th v nh vo Applet hoc vo ca s ng dng. Lp MeiaTracker gip ta theo di qu trnh np v x l nh thay v phi dng n lp giao din ImageObserver.Nu mun truy xut cc ti nguyn my cc b ta cn dng dn di tng Toolkit, i tng ny thng c ly v bng phng thc getToolkit () xut pht t lp Component hay getDefaultToolkit () ca lp Toolkit.Hu ht mun v ra mn hnh chng trinh tp trung vo phong thc paint. Thong thng mun v li ni dung ca ca s ta khng gi trc tip n phng thc paint m gi phng thc repaint (), repaint () s gi phng thc update thc hin nhim v xa ni dung ca s v sau d th gi tip n phng thc paint .Ta cng hc v cc i tng tin ch khc nh Point, Rectangle, Polygon, Dimension dng phc v cho lp ha Graphics. Mu sc c th hin qua lp Color. Mi mu c to ra bng cch pha trn 3 sc : (Red), xanh l cy (Green) v xanh dng (Blue) c gi tr t 0-255. Mu sc to ra theo cch ny gi l mu RGB. K thut ct (clipping) dng hn ch vng v, tt c nhng hnh v ngoi khung ct ny u b loi b. Cui cng lp Print Job s gip ta thc hin cng vic in n, chng trnh c th in vn bn v hnh nh ra my in bng tng Graphics do phng thc getGraphics () ca i tng Print Job tr v,Chng sau ta s nghin ca su hn v cc m hinh mu sc v cch x l nh.

-raphics) Chng 7 : X l nh137J vit mt t Applet n n:1 tng rc end ()I biti tng u. p ra mn nh thayv bngca ca pdate: v cho xanh l lng n cng I () caChng 7 :X L NH (IMAGE PROCESSING)Tm tt chng 7:Vi chng ny ta s lm quen v i su vo tm hiu nhng kh nng x l nh cc k mnh m ca Java. Ta s hc cch x l nh chi tit han nh phng to, thu nh, ct xn hay quay nh... c bit l p dng cc m hnh mu sc (ColorModel) vo vic x l tng im nh (pixel) thng qua cc b lc (filter) d to ra nhng bc nh tht hp dn v l th. Ngoi ra chng nv cng s gip bn tip cn vi m hnh Cung cp- Tip nhn (Producer-Consumer) m Java p dng cho qu trnh to v x l nh.Nhng vn chnli s dc cp trong chng ny:s Cc cch v nh.i tng ImageObserver.s M lnh cung cp-tip nhn (Producer-Consumer).STo hnh nh t vng nh.s Chp hnh nh vo vng nh.s M hnh mu sc (ColorModel).S B lc nh (Image filter).s Dng b m lm khung hnh ph (off-screen).1. CC CCH V NHTrong chng trc ta cp n phng thc drawlmage ca i tng Graphics dng v mt nh ra ca s ca Applet hay ng dng, drawlmage c tt c 6 cch dng vi cc i s khc nhau, phng thc drawlmage lun cn ;nt di s kiu ImageObserver theo di qu trnh np nh, thng th bin this ca Applet (hay bt c i tng no ra i t lp Component) c dng lm di s' ny (xem li chng Di tng ha -Graphics ). Cch n gin nht thng c ng L phng thc v nh:drawlmage (Image img, nt X, int y, ImageObserver observer)Anh c v ra bng ng vi kch thc ban u, trng hp ny ch cn cung cp v tr gc tri trn (X, y) ni nh c v. Di y ta s kho st thm cc cch dng khc ca phng thc drawlmage dc p dng cho vic bin i nh.1.1. Phng to, thu nh nhPhng thc drawlmacte vi di s width, heigh s v ra nh c kch thc co gin so vi nh gc ban u: public boolean drawlmage (Image img, int X, int y, int width, int height,ImageObserver observer)Nu chiu rng width v chiu cao height ln hn so vi nh gc ban u th nh v ra s c phng to, nu nh hn th nh v ra s thu nh li. Trng hp khc nhau kt qu thu c s l mt nh co gin so vi nh gc.Kch thc ban du ca nh gc c th c lv v thng qua hai phng thc getwidth v getHeight saii ca i tng Image:/ / Tr v chiu rng ca ii public int getvth (ImageObserver observer)11Tr v chiu cao ca nhpublic int getHeight (ImageObserver observer)Lu :Khi i tng nh Image dc ly v bng phng thc getlmage, cluta hn kch thc nh c sn.Ccthng tin v nh CI c i tng ImageObserver chuyn giao t t cho thnh pli i tng ang cnhucu np nh. Chnh vi vy mun ly kick thc n/i phi nh n i tng ImageObaerver ly . Phn sau s cp n ca ch quan st qu trnh np nh ca i tng ImageObserver.Chng trnh di y s minh ha cch v mt nh phng to:V d 7-1: Saclelmageavaimport j ava.awt.*; import java. applet .* ; public class Scalelmage extends Applet { Image img; public void init () {/ /Np nh vo i tng Image img=getlmage(getDocumentBase(),"Beans.gif");}public void paint (Graphics g) {/ ILy kch thc ca nh gc int h=mg.getHeight(this); int w=img.getwidth(this);

Ml 138Chng 7 ; X l nhApplet Viewer: Scalelmage.classOrigin imageScale image

Applet started.int y=10;g.drawstring ( "Origin Image", 0,y);/ /V nh gc ra mn hnhy+ = 5;g.drawlmage(img,0,y,this);y=y+h+25;g.drawstring( "Scale Image", 0, y) ;/ / V nh c phng to gp 2 ln so vi nh gcy+=10;g. drawlmage (mg, 0, y,'w*2, h*2, this) ;>}Bin dch:C:\Learning>javac Scalelmage.javaHnh7-1Sa i tp tin MyApplet.html:

Chy chng trnh:c: \liearning>appletviewer MyApplet. html1.2. Xoay nhPhng thc drawlmage di y c th c dng v nh theo nhiu gc khc nhau:public boolean drawlmage (Image img, int dxl, int dyl, int dx2, int dy2,int sxl, int syl, int sx2, int sy2, ImageObserver observer)Anh c v khng nht thit phi l ton b nh gc m c th ch l mt phn ca nh nm trong vng ch nht c ta :gc tri trn v gc phi di l (dxl, dyl# dx2, dy2). Phn nh ny sau s c dng v vo mt vng ch nht (sxlsy2, sx2, sy2) nm trong Applet hay ca s ng dng. Hnh ch nht ni nh v ra c biu din bng cp ta ca 2 gc Cdin nhau l (sxl, syl) v (sx2 / sy2 ) . Nu thay i th t c cc cp gc di din ny kt qu nh v ra s xoay theo nhithng khc nhau.Chng trnh di y s minh ha cch v mt nh xoay theo nhiu gc khc nhau so vi nh ban u.V d 7-2: FliplmageJavaimport j ava. awt. * ;import java.applet.public class Fliplmage extends Applet {Image img;public void init () {img=getlmage(getDocumentBase(),"Beans.gif") ;}public void paint (Graphics g) {/ /Ly kch thc nh gcint h=img.getHeight(this) ;int W=img.getwidth(this) ;/ /V nh gc ban uint y=0;g.drawlmage(img,0,yfw,y+h,0,0,w,h,this);g .drawstring ( "origin image" , w, y+20) ;'AppletApplet Viewer: Fliplmage.dass BEIE3/ /V nh xoay 90 y+=h;g.drawlmage (img, 0,y+h, w,y, 0, 0,w,h, this) ; g. drawstring ( "rotate Image 90 degree" ,w,y+2 0) ;/ / V nh xoay 180 y+=h;g.drawlmage(img,w,y+h,0,y,0,0,w,h,this); g. drawstring ( "rotate image 180 degree" , w, y+20) ;/ /V nh xoay 270 y+=h;g.drawlmage (img, w,y, 0,y+h, 0, 0, w, h, this) ; g.drawString( "rotate image 270 degree" ,w,y+20) ;

origin imagerotate image 90 degreerotate image 180 degreerotate image 270 degree}Applet started.Bin dch:c : \Learning>javac Fliplmage . javaSa i tp tin MyApplet.html:

Chy chng trnh:Hnh 7-2

thng 7 : X l nh139 mC: \Learning>appletViewer MyApplet .htmlVi chng trnh trn, phn hnh nh dng v l ton b nh gc c ta gc tri trn l (0, 0) v gc phi di lt, h). Vng v nh vo cng c kch thc bng vi nh gc, tuy nhin nu ta t vng ch nht dng th hin nh ny khci kch thc ca phn nh mun v vo th nh v s c co gin cho va vi kch thc ch nh V d sau cng c kh nng vnh phng to gp i:#g.drawlmage(img,0,0,w*2,h*2,0,0,w,h,this) ;1.3. Ct nhPhng thc drawlmage trn cng dc dng v mt phn ca nh.Chng trnh di y s v ra mt nh b ct thnh V so vi kch thc nh ban u:Ti d 7-3: CropImage.javanport j ava. awt. *;port java. applet. * ;jblic class Croplmage extends Applet {Image img;public void init () {img=getlmage(getDocumentBase(),"Beans.gif" ) ;}public void paint (Graphics g) {/ iLy cc kch thc ca nh gc. ban unt h=img.getHeight(this) ;nt W=img.getwidth(this) ;/ /V nh gcinty=0;g.drawlmage(img,0,y,w,y+h, 0, 0, w,h, this) ;|H!HkJOcrop imageg. drawstring ( "origin image ,w,y+20) ;//V ni b ct i 'k chiu cao so vi nh ban ull y phn nh dng v l (0,0,w,h2)Applet started.y+=h;g.drawlmage (mg, 0,y, w,y+h/2, 0, 0, w, h/2, this) ;Hnh 7-3g.drawstring ( "crop image" , w, y+20; ;Applet Viewer: Croplmage.class Em 0 origin image>Bin dch:|C: \Learning> javac Croplmage. javaSa di tp tin MyApplet.html:I Chy chng trinh:|C: \Learning>appletViewer MyApplet .html12. I TNG ImageObserverVic dc d liu trn mng thng din ra chm chp, nht l i vi nhng tp tin hnh nh c kch thc kh ln. Java hI tr cho thao tc c nh bng cch dng i tng ImageObserver. i tng ny c coi l mt quan st vin dng theo diI qu trnh truyn ti d liu nh. Hu ht cc hm x l v ly thng tin v nh u cn n di tng ImageObserver ny. Nh c n nn nu phng thc v nh nh drawlmage c gi trong khi d liu nh cha tht s c trong b nh th chng trnh vn tip tc chy. Khi d liu sn sng th ImageObserver s thng bo cho nhng di tng ang c nhu cu truy xut nh thc hin tip cng vic ca mnh. ImageObserver ch l mt lp giao tip (interface) mun s dng n trc ht phi thc hin vic ci t. Tuy vy lp ny ch c mt phng thc duy nht phi ci dt l:public boolean imageUpdate (Imcige img, int infoflags, int X, int y, int width, int height)Ty theo gi tr ca inf of lags m cc i s X, y, width, height cha nhng thng tin khc nhau. Di dy l cc tr c th c ca infof lags trong qu trnh ImageObserver tip nhn d liu nh:ImageObserver.WIDTH ImageObserver.HEIGHT ImageObserver.ERROR ImageObserver.ABORT ImageObserver.PROPERTIES ImageObserver.SOMEBITSImageObserver.ALLBITSKch thc chiu rng nh nhn c.Kch thc chiu cao nh nhn c.Qu trnh tip nhn d liu nh b li.Qu trnh tip nhn d liu nh b /l' b. nhn c cc thuc tnh ca nh.D nhn c mt khi d liu ca ni (l cc im pixel) x,y, width, height l kch thc vng d liu nlin c.D liu nh iin .

m 140Chng 7 : X l n:ImageObserver .FRAMEBITS Trng hp ni gm nhiu khung hnh (nh tp tin *.gif c h tr kh nng hot hnlianimation chng hm, khi mt khung hnh c nhn th infofla3 s cha tr ny.Cc r trn c th c kt hp vi nhau, mun bit tng thng tin c th c th dng on m sau kim tra bie infoflags:/ /Kim tra kch thc chiu rng ca nh c gi n hay cha if ((infoflags&ImageObserver.WIDTH)!=0) {System.out.println("Image M+width); ... chng trc lp MediaTracker c dng theo di tin trnh np nh thav th cho ImageObserver. \ chng ny nhm minh ha v thy c cch lm vic ca ImageObserver, di y lp ImageObserver s c trc t ci dt v da vo s dng.V d 7-4: ImageTrace javaimport j ava. awt. * ;import java.applet;import j ava. awt. image . *;public class ImageTrace extends Applet {Image img;/ I To di tng ImageObserver Observer myTracker=new Observer (this) ; public void init () { img=getImage(getDocumentBase(),"beans.gif" ) ;}public void paint (Graphics g) {/ iLy kch thc. nh (nh n di tng myTrackert int w=img.getwidth(myTracker) ; int h=img.getHeight(myTracker);I* V nh ra Applet - dng i tng myTracer tieo di qu trnh np dull * / g.drawlmage(img,0,0,myTracker);i/In cc kch thc ca nh ra AppletString status = "w="+Integer.toString(w)+" h=" + Integer.toString(h); g.drawstring(status,0,45);}}/*Ci t cho lp IinageObserver*/class Observer implements ImageObserver{Component component;/ / Phng thc khi dng s lu li i lng Component no gi ImageObserver public Observer (Component comp) { c ompone nt=c omp;>/ / Phng thc imageUpdate ny s c gi mi khi d liu nh c chuyn n./ / Kim tra i s infoflags s bit c nhng thng tin dang theo di public boolean imageUpate (Image img, int infoflags, int X, int y, int width, int height) {/ /Kch thc chiu rng nh xc nh cif ((inf of lags tc ImageObserver . WIDTH) =0) {System.out.println("Image width "+width);}/ IKch thc chiu cao nh xc nh cif ((infoflags &imageObserver.HEIGHT)!=0) {System.out.println("Image height H+height);}/ /Nhn dc d liu tht s ca nhif ((infoflags&ImageObserver.SOMEBITS)!=0) {System.out.println("pixels comming : ( "+X+","+y+","+width+"," +height+")");}/ Tt c d liu nh c chuyn giaoif ((infoflags & ImageObserver.ALLBITS)!=0) {System.out.println("Loading image completed ");

[ nh Chng 7 : X l nhhnhchara bier. V: rc ticcomponent. repaint () ; / / Yu cu cp nht li nhI Nu qu trnh nhn cc bt d liu nh hon tt th phang thcI Iny phi tr v tr falsereturn false;>//Qu trnh nhn cc bit d liu nh vn cn ang tip din phng thc ny cn tr v tr truereturn true;}Bin dch::\Learning>javac ImageTrace. javaSa di tp tin MyApplet.html:

Chy chng trinh:C: \Learning>appletViewer MyApplet.htmlVi chng trnh trn thav VI phi dng n bin thisa Applet nh thng l cho phng thc drawlmage, ta ci tng ImageObserver t to l myTracker d thay th.> tng ny c dng lm di s truyn cho cc phng thcn ImagebserVer nh drawlmage. getwidth,etHeight:int w=img.getWidth(myTracker);int h=mg.getHeight(myTracker);drawlmage(img,0,0, myTracker)C: \Learning>AppletViewer MyApplet.htmlImage height 21Image width 36pixels comming : pixels coming : pixels coaming : pixels comming : pixels comming pixels comming : pixels comming : pixels coming : Loading image completedHnh 7-4g.arawimage(img, 0,1, myTracJcer; ;Quail st kt qu cho thy thng tin v kch thc ca nh c tip nhn trc, tip theo l tng khi d liu pixel c luyn n, sau cng nu d liu nh c nhn y th myTracker in ra cu thng bo cho bit tin trnh np nh kt thc. 5'i chiu kt qu tr v t phng thc getwidth v getHeight trong Applet vi kt qu in ra t i tng mTracker l nhau.I. M HNH CNG CP-TIP NHN (PRODCER-CONSUMER) h tr cho qu trnh np nh din ra t t, khng nh hng n cc thao tc khc ca chng trnh, Java xy dng mt B hnh gi l Producer-Consumer (tm gi l m hnh Cung Cp-Tip nhn).3.1. i tng ImageProduceri din cho Producer l lp ImageProducer.Cc ngun d Jiu nh s c i tngImageProucer cung cp v qun l (d liu c th l mt tphnh nh trn mng hoc mt vng nh dng biu dinrth nh thng qua tp hp 1 dy cc byte). Bt c i tngImage no cng u c to ra t mt ImageProducer.Lu : Mun ly c i tng ImageProducer t mt itng Image hy gi phang thc getSource () can.ImageProucer chi l mt lp giao tip (interface), lpchnh thc ci t cho giao tip ny v thng dc s dng nhtl lp MemorylmageSource.vng nh memoiyi tng Imagetp tin hnh nhThng qua tp M emotyl mageS ourceHnh 7-5ConsumerThng qua tp Pixel sG rape*3.2. i tng ImageConsumeri din cho Consumer l lp ImageConsumer.ImageProucer chi cung cp d liu to nh, nu mun tip nhn ngun d liu nh x l trc tip trn tng pixelta phi dng n di tng ImageConsumer. Cng nh ImageProducer, ImageConsumer ch l mt lp giao tipinterface) tru tng. Lp trc tip ci dt cho giao tip ImageConsumer v c th s dng c l lp PixelGrabber.Hnh di y s minh ha cho quan h gi ngun d liu (source), v m hnh Producer-Consumer:Nh vy trong trng hp mun ly d liu tht s ca nh d x l ta mi phi nh n i tng ImageConsumer.Thng thng th sau khi x l ngun d liu nh xong. ImageConsumer s thng bo cho ImageProucer thc hin vic tito li nh t ngun d liu mi d qua x l bi ImageConsumer.3.3. C ch lm vic ca m hnh Proucer-Consumer Producer c xem nh mt my anh bi I1 c kha nng to ra mt hnh nh thc th, trong khi Consumer c xemnh mt nh ch tc v li nh. Mun v c nh th Consumer phi c Producer cung cp li mt s chi tit cn thit nh kch thc nh. s mu sc cn dng, cch trnh by nh, ni dung nh ... Trn thc t c ch lm vic ca cc i tng ImageProducer (i din cho Producer) v ImageConsumer (ai din cho Consumer) din cng tng t nh th. Di dy l cc bc xy ra trong qu trinh chuyn tai nh ca I11 hnh Producer-Consumer:

m 142Chng 7 : X l nh ChrBc 1: Khi di tng Consumer yu cu i tng Producer cung cp d liu v v x l nh, i tng Producer s thc hin vic c kch thc ca nh ngun v ni phng thc setDimensions ca i tng Consumer d thng bo ch bit chiu rng v chiu cao ca nh:nhProducerConsumerc kch thc nh

gi phng thc setDimensions T , ii /JBc 2: Producer tip tc c bng mu (color pallet) ca nh ngun v gi phng thc setColorModel Ci. Consumer Consumer c th n nh mu sc cho nh cn x l (m hnh mu sc s c cp sau).nhProducerConsumergi phng thcf

oc bng mu jfvg setColorModel/> sir ' . iii

pubET-jng nn To rTao cTo a lsr-.r.n, ki V d 7ixport ixport *-=pcrtpw>i c IMTz;, cBc 3: tip theo Producer s c nhng thng tin nh dng nh (image format) v gi phng thc setHints c_ Consumer bo cho i tng Consumer bit d liu nh (cc pixel ) s c gi i nh th no. Thng th phng th. setHints s gi i cc tr sau:ImageConsumer.TOPDOWNLEFTRIGHT ImageConsumer.RANDOMPIXELORDER ImageConsumer.COMPLETESCANLINEt;ImageConsumer.SINGLEPASS ImageConsumer. SIGLE FRAMEnhProducerc nh dng nhgi phng thc setHints^Consumer * ifin lit \ 1i tng Consumer khi nhn c cc tn ny t phong thc setHints s bit cch t chc v sp xp d liu Producer chuyn n sao cho thch hp.nh

Producercd liu nh

gi phng thc setPixels ConsumerI ' TT7 ^117,Im?//MMiiBc 4: Sau khi chun b xong Producer chnh thc chuyn giao d liu nh tht s bng cch gi phng th_ setPixels ca i tng Consumer. Bc 4 ny r. th din ra nhiu ln cho n khi no d liu t nh ngun d c c h:nhProducerConsumerktthcgi phng thcT ~7

qu trnh c ggjjimageCompletea/ft liir il ; III

put3C: Le

y.y,y.yY.y.Y,y

yyyy.y.Y'y.y>yy,yY'y,y.y-y.

y.y,y.y,Y'y.yyy.y,y.y.yY'Y,y.

y.y 1y.b.y.y.yy.y.yy.y.b,y.Y'y,

y.y.y.y.b.y>Y/Y.y.y,y.b,y,Y'y.y,

y.yY'y.y.b.b,y.Y'b,b,y.y.y>Y'y,

w.yY>y,y.y.yb,b.y.y.y,y,y.y/w.

w.w,y.y 1y/y.y.y.Y'y,y.y.yy.w.w.

w.w.w.y.Y-y.yy.Y'y,y.y}11Dng i tng Producer ti to li nh mi sau khi x l.Image newlmage= createlmage (new MemorylmageSource(100, 100, pxs, 0, 100));Vic ly d liu t nh x l xem ra kh phc tp, tuy nhin phn sau, khi lm quen VI b lc nh (image filter) th cc- x l nh s tr nn n gin hn.Di y l chng trnh x l nh c th da trn i tng PixelGrabber. Qu trnh x l s lc b sc xanh di - (blue) ca nh gc to nn nh mi c mu ng vng (thnh phn nh mi ch cn li sc v xanh l cy hp li chnh . mu vng).V d 7-6: ProcesslmageJavaimport java. applet. *; import j ava. awt. * ; import j ava. awt. image . * ; public class Processlmage extends Applet { /1Lu nh gc Image orginlmage;/ /Lu nh mi sau kh x l Image yellowlmage;/1Kch thic nh mi int w = 80 ;

Chng 7 : X l nh145int h = 40;/ /Vng nh cha d liu nhint pixs [ ] = new int [w * h] ;public void init () {IINpnhgcoriginImage=getImage(getDocumentBase(),"beans.gif");/1Ly i tng ImageProducer t nh gcImageProducer proucer=originImage. getSource () ;11 To i tng ImageConsumer ly d liu h Producer a vo dy pixsPixelGrabber pg *r new PixelGrabber (producer, 0, 0, w, h, pixs, 0, w) ;/ /Bt u ly d liutry {pg.grabPixels(); catch (InterruptedException e) {System, err .println( "Error ! " )return;>/ /X l v to ra nh miprocessPicture(pixs);}public void paint (Graphics g) {I / V nh cg.drawlmage(orgnlmage,0,0,this);g .drawstring ( "origin image" , 100, 20);/ / V nh mig.drawlmage(yellowlmage,0,50,this);g .drawstring ( "processed image" , 10 0, 70) ;>/*Phng thc ny s thc hin vic x l nh t nhng im nli pixel trong dy pxsO. Mt i tng nh Image mi s cto ra sau khi x l.*/public void processPcture (int pxs []) {/ /Vng lp ny s x l tng im nhfor (int y = 0; y < h; y++) {for (int X = 0; X < w; X++) {int i=y*w+x;// Loi b sc xanh dng (thnh phn blue)pixs[i] = (pixs[i] Oxffffff00);}>/1 To nh mi sau kill x l xongyellowlmage = createlmage(newMemorylmageSource (w, h, pixs, 0, w) )';}}Bin dch:c: \Learning> javac Processlmage. javaSa i tp tin MyApplet.html:

Chy chng trnh:c: \Learning,>appletViewer MyApplet. htmlSc d xanh dng ca dim nh c loi b bng php ton:pixs[i] = (pixs[i3 &xffffff00);Tip theo sau qu trnh x l ta s to ra nh mi bng cch dng phng thc createlmage cng vi bn dy pixs [] c nh sau:yellowlmasre = createlmage (new MemorylmageSource (w, h, pixs, 0, w) ) ;Vi mn hnh mu th s khc nhau gia nh gc v nh qua x l s c phn bit r.Di dy ta s nghin cu v m hnh mu sc (color model) m Java h tr. Nm vng v mu sc s gip cho qu trnh phn tch v x l nh tr nn hp dn v l th hn.Applet Viewer: Processlmaqe.class rT~r

origin imageprocessed imageApplet started.Hnh 7-7

m 146Chng 7 : X l nhCho4. M HNH MU SC (COLOR MODEL)nh c to ra t i tng ImageProucer hay c x l bi i tng ImageConsumer u thng qua mt dy cctr int, mi tr int th hin mu ca mt im nh pixel. Theo m hnh mu mc nh ca Java ta vn dng t trc n gi thmt mu l s kt hp ca 3 sc d: (red), xanh l cy (green) v xanh dng (blue) v thng c gi l mu RGB. Mi sc mu dc quyn mang gi tr t 0-255 (l kch thc ca 1 byte) nh vy tng cng gm 3 byte dng biu din cho mt tr muTu nhin, kch thc ca mt int tht s l 4 byte nn cn mt thnh phn na cng c dng d biu din cho mu sc, lthnh phn alpha nm byte cn li ca bin int dng ' biu din tr mu. Kch thc ca thnh phn alpha ny l 1 byte nncng s biu din dc cc gi tr t 0-255, l cc gi tr th hin trong sut (transparent) ca mu. Nu l 255 (OxT) th muc th hin hon ton (opaque) cn nu mang tr nh nht l 0 th mu s tr nn hon ton trong sut (transparent) c ngha lkhng cn thy dc mu na. Thnh phn alpha ny vn c th thay i dc nu mun, tc dng thay i alpha s to ranhng hiu ng kh c bit cho mu sc.Lp ColorMoel m Java xy dng nn (lc dng th hin m hnh mu sc thng qua cc thnh phn Red, Green,Blue v alpha trn. Vi mt im nh pixel mang tr int ta c th nh di tng ca lp ColorMoel ly v cc tr th hin sc mu RGB v alpha bng nhng phng thc sau:public abstract int getRe(int pixel)public abstract int getGreen(int pixel)public abstract int getBlue(int pixel)public-abstract int getAlpha(int pixel)Phng thc sau s tr v m hnh mu mc nh ca Java:Static ColorMoel getRGBDef ault ()Lp ColorMoel tht ra l tru tng, v vy ta phi ci t cho lp ny thnh mt lp c th trc khi dng c n. Tuynhin, Java cng h tr hai lp c thit k sn ra i t lp ColorModel d l lp DirectColorMoel vInexColorModel. Hai m hnh ny thc hin vic truy xut gi tr mu theo hai cch khc nhau.4.1. M hnh mu trc tip vi lp DerectColorModelTheo m hnh mu trc tip (direct color model) th gi tr ca mi im nh pixel s th hin chnh sc d ca cc thnhphn R, G, B ca mu. Thng thng mi thnh phn R,G,B dng 8 bit hay 1 byte biu din, do nu t hp li ta s c tngcng 224 mu = 16 triu mu. Mu sc ny cn c gi l mu 24 bit (mu sc thc).M hnh mu mc nh (default color) m Java s dng ln n 32 bit hay1im nhs ckchthc lint=4 byte.Ngoi 3 byte biu din R,G,B, thnh phn byte cn li dc gi l knh alpha biu din trong sut ca mu. Nh vy c th biudin c tng cng 232 mu, s mu ny vt qu kh nng thy c bng mt thc ca con ngi. nh c biu din theo mhnh mu trc tip ny dc gi l nh 32 bit. JPEG l nh lu theo m hnh trc tipny nhng thc hin cc php tonlc bnhng mu khng thy c thu nh kch thc cho tp tin.Lp DirectColorModel dng h tr cho vic truy xut v to cc gi tr mu theo cch ny. nh dng cho cc thnhphn th hin sc d mu R,G,B dc thc hin bng mt mt n bit (bitmask) nhm gip m hnh xc dinh dc mi mu dc lunh th no trong pixel. Phng thc khi dng to ra i tng DirectColorModel cn bit s bit m pixel biu din cho 3thnh phn R,G,B v alpha (nu c) cng vi mt n d trch ra cc thnh phn ny/ /Khng cn n thnh phn alpha. Trng hp ny alpha = 255public DirectColorModel (int bits, int rMask, int gMask, int bMask)/1 Thnh phn alpha cng tham gia to nn gi tr mu cho pixelpublic DirectColorMoel (int bits, int rMask, nt gMask, int bMask, int aMask)V d sau s to ra m hnh mu trc tip 32 ht c c thnh phn alpha:DirectColorModel cm=new DirectCclorModel(32,OxOOffOOO,OxOOOOffOO,OxOOOOOOff,Oxff000000);Cc mt n c th c ly v bng cc phng thc sau:public final nt getRedMask()public final int getGreenMask ()public final int getBlueMask()public final intigetAlphaMask ()*Chng trnh sau s minh ha cch dng m'hnh mu sc feetrc tip vi lp DirectColorModel. Ta v ra hai nh tvng nh pix [ ] mt nh p dng m hnh mu scDirectColorModel t to, cn mt nh p dng m hnh mumc nh ca Java.V d 7-7: DirectColorApplet.import java. applet. * ;import j ava. awt. *;import j ava. awt. image. * ;public class DirectColorApplet extends Applet {Image imgl;Image img2;/*

To mi OxOOffl b choDir11 Tao int int int pub c}pubs5>Phan, i cpub}/ /Phu pubIIIIHT/IT}IIP!pri-E)}Hnh 7-8}C: \L 1y sy sint pix [ ] = new int [w * h] ;/ /Cc thnh phn ca bng mu byte [ ] R =new byte [ 16 ] ; byte[] G =new byte [16]; byte [] B =new byte [ 16] ;/1 i tng IndexColoModel IndexColorModel indexModel ; public void init () { / /Xy dng bng mu buildColorPallet() ; / /t ch s mu cho cc im nh setlmageColor();/*To i tng IndexColorModel, kch thc bng mu l 16, kch thc ca 1 im nh l 4 bit (tr n c ti a 16 mu). Thnh phn alpha ca mi mu trong bng mu ly gi tr mc nh l 255.*/indexModel= new IndexColorModel(4,16,R,G,B); / /To nh t vng nh theo m hnh mu ch s source = new MemorylmageSource (w, h, indexMoel.pix, 0, w) ; image =createlmage(source);>public void paint (Graphics g) { g.drawlmage(image,5,20,this) ;}/ /Phng thc ny dng xy dng bng mu public void builColorPallet(){/ /To 16 thang xm khc nhau for (byte i = 0; i< 16; i + + ) { R[i]=(byte)(16*i); G[i]=(byte)(16*i); B[i]=(byte)(16*i);}an>hngIg nh ang /*Phang thc ny dng dt cc ch s cho tng im nh, cc ch s ny s ch n mu tong ng trong bng mu.*/public void setlmageColor () {int inex=0;for (int x=0; x javac InexImageApplet. javSa i tp tin MyApplet.html:

Hnh 7-11Chy chng trnh:c: \Learning>appletViewer MyApplet. htmlChng trnh Applet trn c tt c 16 vung mu c v ra. Mi mu c kch thc 16x16 do tng cng ta phi dngmt vng nh vi kch thc l:int w = 16*16;int h = 16;int pix[] = new int [w * h] ;Khi 3 thnh phn R,G,B mang cc tr bng nhau th ta c mu xm, nh vy tng cng c th to ra 255 thang xm khc nhau. Tuy nhin y chng trnh ch s dng 16 thang xm, ini thang xm cch nhau gi tr l 16. Vng lp for trong phng thc setlmageColor () c trch nhim t ch s mu cho tng im nh: for (int x=0; xappletViewer MyApplet .htmlHnh 7-166. CC PHNG PHP X L NH M RNGTrn y l cc cch dng b lc bin i nh. a s u tp trung vo vic x l v chuyn i tng im nh theo cc thnh phn mu alpha, R. G, B. p dng b lc RGBImageFilter v ci t cho phng thc f ilterRGB ta c th lc v bin i mu sc ca nh to ra mt s' hiu ng c bit khc.6.1. S dng thnh phn alpha lm nh trong sutThnh phn alpha th hin trong sut ca mu, nu thay i thnh phn alpha t 0-255 th mu sc ca im nh cng s chuyn bin theo. Chng trnh di y s np vo mt nh, thay i thnh phn alpha ca tng im nh khi ngi dng nhn vo thanh trt Scrollbar th hin cng alpha t 0-255:V d 7-15: AlphalmageApplet javaimport java. applet. *; import j ava. awt .*! import j ava. awt. image. * ; import j ava. awt. event. * ; public class AlphalmageApplet extends Applet{

m Applet Viewer: RotatelmageApplet. class HIIE3

m 156Chng 7 : X l nh I c r')}Image img;Image alphalmage;public void init () {img=getlmage(getDocumentBase(),"flower.gif'/ /X l v to ra nh mi vi tr alpha cc i l 255createPicture(255);11 To thanh trt ngang dng thay i tr alphaScrollbar myScroll = new Scrollbar (Scrollbar.HORIZONTAL, 0, 1, 0, 255);add(myScroll);myScroll. addAdjustmentListener (new AdjustmentListener {} {public voidadjustmentValueChangea(AdjustmentEvent evt) {//Khi thanh trt thay i nh c v li theo gi tr alpha miint X = evt.getValue();createPicture(255-x);repaint();}>);}public void paint (Graphics g) {/ / V nh thay i thnh phn alphag.drawlmage(alphalmage,0,0,this);g.drawstring( "alpha image", 110, 50);/ /V nh gc so snhg.drawlmage(img,0,85,this);g. drawstring ("origin image", 110,140);}/ /Phng thc ny s to ra nh mi da trn tri alpha v b lc AlphaFilterpublic void createPicture (int alpha) {AlphaFilter filter=new AlphaFilter (alpha) ;alphalmasre=createlmage (new FilteredlmageSource (img.getSource () , filter) ) ;}}/ I Lp ny ci t b lc dng thay i gi tr alpha ca nhclass AlphaFilter extends RGBlmageFilter{int alpha;public AlphaFilter (int alpha) {this.alpha=alpha;>public int f ilterRGB(int X, int y, int rgb) {return (alpha javac AlphalmageApplet. javaSa i tp tin MyApplet.html:

Chy chng trnh:c: \Learning>appletViewer My Applet. htmlIm Applet Viewer: AlphalmageApplet. class 000 S31

Applet

alpha image

origin image

Applet started.

Hnh 7-17Bng cch gim tr alpha t 255 dn xung n 0 hay tng tr alpha t 0 n 255 ta c th khin nh t t bin mt hay t t hin ra. Phng php ny l mt trong nhng cch thng c dng trong cc k xo hot hnh (animation).6.2. Bin i nh thnh m bn (negative)Php ton XOR ln cc im nh c th lm cho nh chuvn t nh dng bn sang m bn hay ngc li. Di y l b lc thc hin k thut ny:V d 7-16: NegativeFilter.java /*B lc chuyn nh thnh m bn bng cch xor cc sc mu vi tr OxFFFFFF */class NegativeFilter extends RGBImageFilter{ public int filterRGB(int X, int y, :i.nt rgb) {ic/re>}B6.3.Kziu xrr ihng shn R.c lc thc 1V d 7-public pub] ir ir ir irin'>6.4.C tay di.V d 7-1public publNt znh ma . ifreB6.5. Khtnnh ph chinh = sang dn.Vi d 7-1!ixport isport ; inport ; inport ; public < Image: Image 1 public

Chng 7 : X l nh157 m/ /Gi li thnh phn alpha nt alpha= (rgb& OxffOOOOOO) ;//Cc thnh phn R,G,B c XOR vi mu trng Oxffffff return alpha +(rgb&OxOOffffff) A Oxffffff;Applet Viewer: NegativeFilterApplet-dass HEPApplet>B lc ny s cho ra nh kt qu nh hnh 7-18:6.3. Bin i nh mu thnh nh c thang xmKhi 3 thnh phn R,G,B mang gi tr bng nhau ta s dcmu xm. Chuyn i t nh mu sang nh c thang xmIhng c thc hin bng cch chn gi tr cc i ca 3 thnhphn R,G,B lm gi tr xm th hin cho im nh. Di dy l blc thc hin k thut ny:V d 7-17: RGBGrayFilterjavapublic class RGBGrayFilter extends RGBImageFilter{public int f ilterRGB(int X, int y, int rgb) {int alpha=(rgb & Oxff000000) ;int red= (rgb & Oxff 0000) >>16;int green= (rgb & OxOOf f 00) >>8;int blue= (rgb & OxOOOOff) ;/ / Tnh thang xm cho im nhint grayLevel=Math.max(red,Math.max(green,blue));return (alpha) +(grayLevel/1 Lp ny ci t cho b lc dng d tng gim sng/ti ca nhclass BrlghtnessFllter extends RGBImageFilter{int bright;public BrightnessFilter(int bright) {this.bright=bright;>public int f ilterRGB (int X, int y, int rgb) {/1 Trch ra cc thnh phn R,G,B v alphaint alpha=(rgb & OxffOOOOOO) ;int red= (rgb & Oxff 0000) >>16;int green= (rgb & OxOOffOO) >>8;int blue= (rgb & OxOOOOf f) ;/ / iu chink citng sngred=re+bright;if (red>255) re=255;if (recO) red=0;green=green+bright;if (green>255) green=255;if (green255) blue=255;if (blueFilelnputstream f=new Filelnputstreamfargs[0] ) ;By gi ta c th xem bt c tp tin no bng lnh:java ReadFileApp V d :c: \Leariiing>java ReadFileApp HelloVorl. java public class HelloWorld { public static void main(String args [] ) { System.out .printIn ( "Hello World" ) ;}}6. LP FILEOUPUTSTREAMTa c th d dng on c lp FileOutputStream ngc li vi lp Filelnputstream. Lp ny cung cp kh; nng ghi d liu xung tp rin, c dn xut t lp cha Outputstream:OutputStreamFileOutputStream Ta cng c 3 cch khi dng i tng cho lp Outputstream ny l :FileOutputStream(String name) FileOutputStream(File f)

tap tin Chng 8 : X l lung v tp tin165 ^I. Sau d:liu c: i c:tp ti.", v c. ngoi l'C bt CJin lnhcp khaFileOutputStream(FileDescriptor fdObj)Ta thng dng cch th nht (cho bit tn tp tin m d liu cn ghi xung). Cch th hai v ba ch dng khi no ta c trong tay i tng File hoc FileDescriptor.Di y l v d minh ha. Chng trnh s c mt chui do ngi dng nh vo t bn phm sau d ghi chui ny xung lp tin c tn LINE . TXT cng th mc hin hnh.V d 8-2: WriteFileApp javaimport j ava. io. * ; class WriteFileApp { public static void main (String args [] ) { byte buff er [ ] = new byte [80] try { System.out .print ( "Enter a line to be saved to disk: ") ; int num = System, in. read(buf fer) ; FileOutputStream f = new FileOutputStream("line.txt"); f.write(buffer, 0, num) ; f.close();}catch (Exception e) { System.out.printIn(e.toString());}>Bin dch chng trnh :c: \Learning> java WriteFileApp. javaChy chng trnh :c:\Learning>java WriteFileApp Enter a line to be .saved to disk : xin Chao!Hy g vo chui xn chao! v nhn Enter. Lc ny chui c ghi xung tp tin LINE.TXT trong th mc C: \Learning, chc ] ng ta hy dng lnh type ca DOS xem ni dung ca tp tin ny: c: \Learning>type Line . txt Xin chao C th dng chinh chng trnh ReadFileApp chng ta d vit trc d xem nh sau:C: \Learning>Java ReadFileApp Line, txt Xin chao!By gi ta th xem WriteFileApp. java c vit nh th no :u tin chng trnh to mt vng dm buffer l mt mng 80 byte: byte buffer [] = new byte [80]; . '- t t bn phm '/o b m Java dng lnhint num = System.in.read(buffer);Tht ra System, in l i tng lung c ci t c bit t lp Inputstream, xem li cc phng thc rea() ca lp Inputstream ta s thy i tng System, in s dng phng thc read () theo kiu int read (byte [ ] b) dng c d liu a vo mng b.Nhng g ngi dng nh vo t bn phm s c chuyn vo mng buffer. Phngthc read()tr vs k tdcdc gn vo bin num. Sau ta to di tng tp tin line. txt t lp FileOutputStreamnh sau:FileOutputStream f = new FileOutputStream("line.txt");T ghi b m buffer xung tp tin va to :f.write(buffer, 0, num)?B m buffer c tt c 80 byte nhng ta ch ghi t byte 0 cho n num l s k t thts o ngidng gvo mthi.y chnh l cch s dng phng thc k tha t lp cha Outputstream: write(byte[] bytes, intoffs, int length) y ta ch bt ly c mt ngoi l l: catch ( Exception e ){System.out.println(e.toString()) ;>So vi chng trnh ReadFileApp ta phi n bt ly n hai ngoi l . Nu i lc khng bit phi n bt ly ngoi l no khi gi mt phng thc ca lp hay i tng, trng hp nn dng lp ngoi l tng qut Exception n bt tt c cc li thuc v ngoi l. Tt c cc lp ngoi l khc u c dn xut t y m ra c. Tuy nhin, v Exception l lp ngoi l tng qut nn ta khng bit c chnh xc l li g, lc ny ta s phi gi phng thc toString () d cho in ra ch danh li .V dang cp n vic x l tp tin nn thit ngh ta cng nn tm hiu lun lp File v lp RandomAccessFile .7. LP FILE V CCH S DNGXem li cc lp ca th vin java.io ta s thy lp File ny khng lin quan g n lp Inputstream v Outputstream c. N nm nh mt lp ring bit khng phc v cho vic xut nhp d liu trn lung. Tuy nhin vic to dng lung di khi li cn dng n n chng hn ta c th to lung xut d liu ln tp tin theo cch new FileOutputStream(File f) .

Chng 8 ; X l lung v tp :Nu nh mun bit thng tin v tp tin, ta s dng n lp File . Lp ny gip nm bit c chitit v tn tp tin,ngytp tinc to ra, kch thc ca tp tin, v tr lu trn a ... Ta cng c th dng lp File to th mc,i tn, xa tptin... s dng c lp File ta cn to ra cc i tng t lp ny, lp File c 3 cch khdi dng di tng nh sau:File (String path)File (String path, string name)File (File dir, string name)Phng thc khi dng u tin to i tng File t tn tp tin vi ng dn y . V d:File f=new File("C:\Learning\MyApp.java")Phng thc khi dng th hai to tng File t ng dn v tn tp tin cch bit. V d:File f=new File("C:\Learning","MyApp.java")Phng thc khi dng th ba to i tng File t mt i tng File khc, kt hp vi tn tp tin. V d:/ / To i tng ca lp File l th mc hin hnh (th mc cng xem nh tp tin)File curDir=new File;11 To i tng tp tin nm trong th mc hin hnh tn l HelloWord.java File f=new File(curDir,"HelloWorld.java") ;Lp File c mt tp hp phong ph cc phng thc phc v cho nhng thao tc xvi l tp tin m ta s cn dng n sau n> '.. "l - ^UngChcnng, ..Tr tr yrrahWamo \TJi'.../Oi_:.1getName()getPathOgetAbsolutePath()getAbsoluteFile(>getCanonicalPath()getCanonicalFilegetParent()getParentFile()exists()createNewFile()createTempFile(Stringpattern. File dir)createTempFile(Stringprefix)deleteOnExit()canWrite() canrRead() setReadOnly() isFile() isDirectoryo isHidden() lastModified()setLaatModified (long time) length() mkir() mkdirs() renameTo(File est) listoLy tn ca i tng tp tin.Ly ng dn ca tp tin.Ly ng dn tuyt i ca tp tin.Ly ng dn tuyt i ca tp tin.Ly ng dn chun.Ly ng dn chun.Ly tn th mc cha.Ly i tng l th mc cha.Xem tp tin c tn ti hay khng.To mt tp tin mi (tp tin ny phi cha c trn a). To tp tin tm thi, tp tin c to ra bng cch kt hp mu *n pattern kiu chui vi i tng r l mt th mc kiu File.To tp tin tm, dng th mc mc nh ca h thng kt hp vi mu tn prefix m bn t.Yu cu xa tp tin khi chng trnh chm dt (chinh xc han l khi my o java khng cn hot ng na). Chng hn i vi nhng tp tin tm ni bn to ra.Cho bit tp tin c c php ghi hay khng.Cho bit tp tin c php c hay khng.t thuc tnh ch c (read, only) cho tp tin.Cho bit tp tin c hp l hay khng.Cho bit tp tin c phi l mt th mc hay khng. Kim tra xem tp tin c n khng.Thi gian cp nht sau cng.Dt li thi gian cp nht cho tp tin.Cho bit kch thc ca tp tin (byte).To mt th mc t i tng file.Cng nh phng thc Itikdir () nhng s to ra c th mc cha nu n cha tn ti.i tn tp tin hin ti sang tp tin khc.Ly danh sch tn cc tp tin v th mc.chui (String)chui (String)chui (String)i tng (File)chui (String)i tng (File)chui (String)i tng (File)true = c ; false =khngtrue nu to tp tin thnh cngNu thnh cng s tr v itng tp tin tm kiu File.Nu thnh cng s tr v i tng tp tin tm kiu File.truetruenu cctrue = c true = c true = clong : s khc (1/1000 giy) m c, tnh t 00:00:00 gi GMT thng 1 nm 1970.time l s khc tnh t 00:00:00 gi GMT thng 1 nm 1970. longtrue nu thnh cng. true nu thnh cng.Tr v mng kiu chui bao gm danh sch cc tp tin tm c (String[]).

Chng 8 : X l lung v tp tin. 1'hng tbc, Chc anl ,Tri tr vlist (FilenameFilterLy danh sch tn cc tp tin tha mniukinTr v mng kiu chui baofilter)Lc. Chng hn bn ch mun tm cc tp tin*. gl f-gm danh sch cc tp tin thamn (String]).delete ()Xa tp tin.True nu xa thnh cng.equals ()So snh 2 i tng tp tin.True nu ging nhau.toString ()Tr v ng dn ca tp tin.Chui (String).toURL ()Tr v i tng URL tng ng vi tptin.i tng (URL).Ta thng dng nht l phng thc list (): public String [] listolist () s tr v mt danh sch cc tn th mc v tp tin ta x l. ( rng th mc cng c xem nh l mt i tng tp tin thuc lp File).V d sau s lit k tt c tp tin v th mc hin c trn da c:V d 8-3: FileAppjavaimport j ava. io. * ; public class FileApp { public static void main (String args [] ) { File curDir=new File("C:\\"); String[] dirs=curDir.list(); for (int i=0; iBin dch chng trnh:C: \Learning>javac FileSelectApp. javaChy chng trnh:C: \Learning> java PileSelectApp C: \Learning HelloWorld.java HelloWin.java SystemlOApp.j ava Re adF i1eApp.j ava WriteFileApp.java FileApp.java FileSelectApp.javaKt qu cho thy ch nhng tp tin c phn m rng l . java mi dc in ra m thi. Chng trnh trn ci t lp JavaFile dng d lc tp tin bng phng thc accept (). Khi ly danh sch cc tn tp tin ta a b lc JavaFile vo nh sau:String t] dirs=curDir .list (new JavaFile () ) ;Chng trnh FileSelectApp dng tn th mc dc truyn theo tham s dng lnh. rng i vi ng dn th mc c : \Learning chng hn, nu trc tip vit trong m lnh ta phi thay mt du s thnh 2 ln c: WLearning, th nhng khi truyn bng tham s' trn dng lnh th c th vit bnh thng l c: \Learning.Vic s dng b lc bt buc phi thit k thm mt lp na. Nu thy kh chu th ta vn c th s dng cch m chng trnh FileApp lm, bin di i mt cht. Hy bin dch v chy chng trnh sau. bn s c kt qu tng t vi chng trnh FileSelectApp.V d 8-5: FileSelectExApp.javaimport j ava. io . * ;public class FileSelectExApp { public static void main (String args [] ) { File curDir=new File (args [0] ) ;String[] dirs=curDir.list(); for (int i = 0; i9. TO NHNG TP TIN TM THI (TEMPORARY FILE)Java 1.2 cung cp thm cho ta kh nng to tp tin tm thi. Tp tin tm rt c ch v c dng vo nhiu mc ch khc nhau ty theo tng chng trnh. to tp tin tm ta gi phng thc tnh createTemporaryFile ca lp File. l s truyn cho phng thc ny l mt chui dng lm mu (pattern). Chui mu ny bao gm t 3-4 k t, ghp vi du # v phn m rng. Du # s c h thng thay th bng 4 k s bt k m bo tn tp tin s l duy nht Nu ta khng cho bit phn m rng th Java mc dnh l tmp. Hy xem v d sau:V d 8-6: FileTempAppjava import j ava. io. * ; public class FileTempApp { public static void main (String args [] ) { byte buf fer [] =new byte [80]; String line="Hello Java"; for (int i = 0; icline.length(); i++) buffer [i] = (byte)line.charAt(i) ; try { File temp=File. createTempFile ( java# .xyz" ) ; FileOutputStream f=new FileOutputStream(temp) ; f.write(buffer,0,line.length()); } catch (Exception e) { System, out .println ( "Can not create temporary file") ;>;>Sau khi bin dch v chy chng trnh trn da (trong th mc hin hnh) s xut hin tp tin java???? .xyz, ni dung ca tp tin ny s cha dng ch Hello Java. Bn du ? chnh l 4 k s m h thng thay cho k t # t mu tn m ta a vo, ty vo h thng v thi gian to m bn s n;' lun khc nhau (trn my th nghim tp tin ny l javal306 .xyz).u tin chng trnh trn to mt vng m buffer c kch thc 80 byte, v mt chui Hello Java, tip n ta a tng k t trong chui vo vng m bng vng lp : buffer[i]=(byte)line.charAt(i);Bc k tip l to tp tin tm theo mu tn java#xyz, v mt lung xut ghi ln tp tin tm va to. Nu d s thy ta to lung xut theo phng thc nhn di tng File lm i s truyn vo ch khng dng tn tp tin: new FileOutputStream(File f)y cng l mt cch khc to nn lung xut.10. XA TP TIN TM THITp tin tm ch to ra tm thi cha nhng khi d liu, n ch dng cho ni b ca chng trnh, ngi s dng khng h quan tm n nhng tp tin ny, v vy nu to ra th ta phi dn dp sch s trc khi chm dt chng trnh. Java cung cp phng thc eleteOnExt () lm iu ny. Tr li v d trn, sau khi to ra tp tin tm:File temp=File.createTempFile("java#.xyz");Ta cn xc nh tp tin ny phi b xa khi chng trnh chm dt bng cch thm vo dng lnh: temp.eleteOnExit()Sau th khng cn quan tm n n na. H thng s t ng xa n i khi chng trnh kt thc. Mt iu nn lu l sau khi gi phng thc deleteOnExit () ri, ta khng th no bo h thng thi dng xa na c, mun vy ta phi to li mt tp tin tm khc. Th hai l tp tin tm ch b xa khi h thng my o java hot ng v kt thc bnh thng, trng hp chng trnh ca ta lm treo my hay cp in dt xut th cc tp tin tm vn nm tr l trn a v tr thnh rc.11. LP RANDOMACCESSFILE V CCH s DNGVic x l tp tin cho n thi im ny trng c v kh phc tp, chia ra th lp chng bit dng lp no c. Tuy nhin, cc nh sng to nn Java cng thy c iu v to thm cho ta mt lp khc c kh nng c/ghi d mi th trndilinquan n tp tin, l lp RanomAccessFile.Vi lp ny, khi thao tc trn tp tin ta c th t do diu khincontrtptin(file pointer) cng nh c/ghi bt c kiu cu trc d liu no.C l t ngu nhin (random) mun ni rng d liu c th c c hoc ghi xung t bt k v tr no trn tp tin ch khng nht thit phi i theo trnh t t u n cui. Vic truy xut ngu nhin ny c thc hin nh phng thc seek () gip di chuyn con tr tp tin n v tr m ta mun ly hay ghi d liu.Lp RandomAccessFile ci t c hai giao din Datalnput v DataOutput nn c th dng chung lun cho c vic c cng nh ghi d liu vo tp tin. Ta c th m tp tin theo tng ch (mode) chi c (read only) hay va c va ghi (read/write).i tng thuc lp RandomAccessFile c th c khi dng theo 2 cch sau:RandomAccessFile (String name, string mode) RandomAccessFile (File f, string mode)Cch th nht dng tn tp tin, cn cch th hai dng mt i tng kiu File. C 2 cch u cn ch m tp tin (mode) kiu chui. (Nu m tp ti ch ch dc mode = r hoc rng Nu ch va c va ghi th mode=rw).Khi d to dc di tng RandomAccessFile ta c th dng hu ht cc phng thc hu ch sau:

Chng 8 : X l lung v tp tinmsmmmmmsmmmmmmmmMBmmmmmmmstmmmMPhng thc...Chcnntclose ()ngtptin.getFDOgetFilePointer()length()rea()readBoolean()readByte()reachar()readDouble()readFloat()readFully()readlnt()readLine()readLong()readshort()readUnsignedByte(readUnsignedShortreadUTF()seek ()skipBytes()write()writeBoolean()writeByte()writeBytesOwriteChar()writeChars()writeDouble()writeFloat()writelnt()writeLong()writeShort()writeUTF()Di dy l v d minh ha s dng lp RandomAccessFile.V d 8-7: RandomIOApp.javaimport j ava. io. *;public class RanomlOApp {public static void main (String args [] ) {try{RandomAccessFile f = new RandomAccessFile("test.txt", "rw");f.writeBoolean(true);f.writelnt(123456) ;f.writeChar('j);f.writeDouble(1234.56) ;f.seek(l);System.out.println(f.readlnt()) ;System.out.println(f.readchar() ) ;System.out.println(f.readDouble());f.seek(0);System.out.printIn(f.readBoolean());f.close(); catch (Exception e) {}>}Bin dich chng trnh:Ly v i tng FileVeacriptor ca tp tin. Ly v tr hin hnn ca con tr tp tin.Ly kch thc tp tn.c d liu t tp tin.c tr kiu boolean.c tr kiu byte.c tr kiu char.c tr kiu double.c tr kiu float.c d liu vo y mt mng.c tr kiu Int.c mt dng vn bn t tp tin.c tr kiu long.c tri kiu short int.)c tr kiu kiu byte (khng du).()Dc tr kiu short Int (khng du).c mt chui UTF.Di chuyn v tr con tr tp tin.Nhy qua mt s byte trn tp tin.Ghi d liu xung tp tin.Ghi tr kiu boolean.Ghi tr kiu byte.Ghi mt chui c xem nh l mt dy cc byte. Ghi tr kiu char.Ghi mt chui c xem nh l mt dy cc char. Ghi tr kiu double.Ghi tr kiu float.Ghi tr kiu int Ghi tr kiu long.Ghi tr kiu short int.Ghi mt chui UTF.

tinChng 8 : X l lung v tp tinc: \Iiearning> j avac RandomlOApp. j ava Kt qu chy chng trnh: c: \Learning> j ava RandomlOApp 123456 j 1234.56 trueu tin chng trnh to ra mt tp tin l i tng thuc lp RandomAccessFile theo ch c v ghi (tp tin ny c tn test. txt nm trong th mc hin hnh) nh sau:RandomAccessFxle f = new RandomAccessFile("test.txt","rw");Tip theo vi i tng c c, ta ln lt ghi cc kiu khc nhau xung tp tin (boolean, int, char, double). Sau th hin tnh ngu nhin, ta di chuyn n cc v tr khc nhau trn tp tin (bng phng thc seek ()) c li kt qu d ghi v in ra mn hnh.Chng trnh cho thy ta ch cn dng tng thuc mt lp RandomAccessFile duy nht phc v cho c 2 thao tc c v ghi, khng cn phi dng n 2 i tng thuc 2 lp khc nhau l Filelnputstream v FileOutputStream.Thao tc trn tp tin nh vy l kh nhiu. By gi ta hy xem qua cc lung c bit khc phc v cho vic x l v di chuyn d liu.12. S DNG CC LP NHP/XUT TRUNG GIAN (FILTER 10 STREAM CLASS)Mt trong nhng kh nng mnh m ca vic s dng lung l ta c th' chuyn d liu t lung ny sang lung khc. Chng hn i vi lung dc tp tin c bn Filelnputstream, sau khi m tp tin, mi ln c ta ch ly ra c 1 byte d liu, lm cch no chuyn dng d liu l mt dy cc byte ny phn thnh tng chui (String) hay tng kiu d liu s cp (int, float) c? Java cung cp hai lung dc bit lm trung gian ni cc lung di thng qua nhau d l F Iter Input stream v FilterOutputStream, tt c cc lung xut nhp l con ca 2 lp tin bi ny u c th tip nhn ngun d liu t cc lung khc.Phng thc khi dng cho di tng thuc lp Filterlnputstream v FilterOutputStream s nhn bt c di tng no thuc lp con ca lp Inputstream v Outputstream lm i s : public Filterlnputstream(lnputstream in). public Filterlnputstream(0utputstream out).Chnh v vy mi ngun d liu nhp hay xut (t lung Filelnputstream hoc FileOutputStream chng hn) u c th chuyn giao cho cc lp con ca 2 lp lung trung gian c bn ny. By gi ta hy xem c ch lm vic ca cc lung trung gian ny l nhu th no.13. LUNG NHP TRUNG GIAN (FILTERINPUTSTREAM)Lp Filterlnputstream s dn xut ra cc lp lung con thc t hn gip ta c tip nhn cc loi d liu khc nhau. Di y l cc lp con ca lp Filterlnputstream:InputStream FilterlnputStream Bufferedlnputstream Datalnputstream LineNumberInputStream PushbacklnputStreamLp Filterlnputstream c dn xut t lp cha l Inputstream, t nn mng cn thit cho cc lp con ca n c th tip nhn bt k ngun d liu ca nhng lung xut pht t lp Inputstream .Hy hnh dung ngun d liu ta nh mt bn nc, cn cc i tng lung trung gian ta nh nhng ng dn ni kt vi nhau dn nc ra ngoi, ng dn c th' to nh khc nhau khin nc dc ly t bn ra ty theo on ng c th chy mnh hay yu, nhutig nhn chung nc chy trong ng l thun nht. V mt dc im na l cho d ta ly nc ra t bt k on no ca dng chy th ngun nc trong bn cng phi suy gim theo. Di y l v d minh ha, chng trnh c d liu t cc lung trung gian:V d 8-8: FilterlOApp javaimport j ava. io. *; public class FilterlOApp { public static void main (string args n) throws Exception{ Filelnputst/ream f=new Filelnputstream("HelloWorld.java"); Datalnputstream sl=new Datalnputstream(f) ;Datalnputstream s2=new Datalnputstream(sl) ;,Datalnputstream s3=new Datalnputstream( s2) ;/ / c/io bit trng thi ca lungSystem, out.printlnC Source available f : " +f . available ());System.out .printIn(" Source available si:+sl.available {)) ;System.out.printlnC Source available s2 : " +s2 . available ()) ; System.out .printlnt11 Source available S3 : " +s3 .available ()); System, out .print ( "Read from f : ")} System.out.println((char) f.read());/ /Cho bit trng thi ca lungSystem.out .println( M Source available f +f . available ());

Chng 8 : X l lung v tp tinSystem.out .println ( " Source available si: " +sl. available ()) ;System.out .println( " Source available s2 : " +s2 .available ()) ;System, out .println ( " Source available S3 : " +s3 . available ()) ;System.out .print ("Read from si: ") ;System.out.println(si.readLine());/ / Cho bit trng thi ca lungSystem.out .println C'Source available f +f. available ()) ;System, out .println " Source available si: " +sl. available ()) ;System.out .printIn { " Source available s2 : " +s2 . available () );System, out. println(" Source available S3 : " +s3 . available ());System, out .print ( "Read from s2 : " ) ;System, out.printin (s2 .readXj*ne ()) ;/ /Cho bit trng thi ca lungSystem.out .println( " Source available f : " +f.available ()) ;System.out .println( " Source available si: " +sl.available ()) ;System.out .println( ' Source available s2 : " +s2 .available () ) ;System, out .println ( " Source available S3 : " +s3 . available ()) ;System.out.print("Read from S3: ) ;System.out.println(s3.readLine());System.out .println( " Source available f +f . available ()) ;System.out.println(" Source available si: " +sl.available ()) ;System, out .println( " Source available s2 : " +s2 .available ()) ;System.out .printlni " Source available S3:" +s3 . available ());>>Bin dch:C:\Learning>javac FilterlOApp. javaNote: FilterXOApp. java uses a deprecated API. Recompile with "-deprecation." for details.1 warningKt qu chy chng trnh'.C:\Learning>java FilterlOAppSource available f :118Source available si: 118Source available s2:118Source available 3 :118Read from f : pSource available f :,117Source available si: 117Source available s2:117Source available S3 :117Read from si: ublic class HelloWorld {Source available f :91Source available si:91Source available s2:91Source available s3:91Read from s2 :public static void main (String args u HSource available f :48Source available si:48Source available s2:48Source available s3:48Read ~rom S3 :System.out.println( "Hello World") ;Source available f :6Source available si: 6Source available s2:6Source available S3 : 6C ch hot ng ca chng trnh :u tin ta m mt lung nhp f c d liu t tp tin HelloWorld. java. (D liu ca tp tin c th coi l mt bn cha nc). Nh cho thy lung xut nhp tp tin ch thao tc trn dng d liu l tp hp nhng byte nh phn, nu mun c d liu trc tip t lung f ny ta phi chuyn i d liu m hm read () tr v sao cho ph hp, v nh d c c 1 k t t tp tin ta phi thc hin lnh :(char) f.read{)Kh nng ca lung trung gian s gip ta chuyn dng d liu t lung ny sang lung khc d dng x l hn.Tr li vi chng trnh trn, sau khi c d liu t lung f ta to thm mt lung khc l sl t lp Datalnputstream, lung ny c kh nng c c cc loi d liu khc nhau ( y ta mun ly ra tng chui vn bn trong tp tin HelloWorld. java). minh ha cho kh nng kt ni ca lung, chng trnh to thm 2 lung na l s2 v s3 cng cng lplung l

Chng 8 : X l lung v tp tinDatalnputstream. (Cc lung sl, s2, S3 ta h nhng ng dn ghp li vi nhau ly nc t bn ra hay ni chnh xc l c s' liu t tp tin).Sau mi bc dc d liu ta li gi phng thc available () ca mi lung d bit hin ti trong lung cn li bao nhiu byte. Lung f ch c kh nng c c mi ln 1 byte trong khi lung sl, s2, S3 li c kh nng c c mi ln mt dng vn bn, chnh l l do ti sao ta li mun chuyn d liu t lung f sang cc lung sl, s2, S3 thuc lp Datalnputstream.ng ngha nh mt dng chy d liu, h mi ln ta ly d liu ra t lung no l cc lung khc u nht lt gim theo. Qua v d trn cho thy vic kt ni cc lung tht dn gin, tng qut c th to ra mt lung bng cch tip nhn d liu t lung khc nh sau:/ /To ngun d liuFilelnputStream f=new Filelnputstream("HelloWord.java")/ / To lung trung gian sl t ngun d liu f cDatalnputstream sl = Datalnputstream f) ;//To lung trung gian 82 t lung sl da quaDatalnputstream s2 = Datalnputstream(sl) ;... Qu trnh lp ghp c th din ra bao nhiu l ty . Trong trng hp ch mun to ra 1 lung trung gian ta c th vit gn hn :Datalnputstream sl= Datalnputstream(new Filelnputstream("HelloWord. java") )hoc:Datalnputstream s2= Datalnputstream(new Datalnputstream( new FileInputStream("HelloWord.java")))14. LP BUFFEREDINPUTSTREAMVic truy xut tp tin trc tip trn a (hay trn mng) c th gy ra chm chp, do mi ln ta thc hin thao tc ghi hay c mt k t t tp tin chng trnh li phi d tm trn a (hoc ti mt my no d xa). C mt c ch khc nhanh hn l s dng b m (buffer). B m chng qua l mt vng nh c kch thc quy nh, khi dc d liu t tp tin, chng trnh khng dc tng k t m c mt lng ln d liu a vo va vi kch thc b m, lc ny nu ta c nhu cu c tng k t th chng trnh khng cn phi tm n v tr vt l trn a na m c th truy xut ngay t vng m nm trong b nh ca my tnh, nh vy tc x l s nhanh hn. Khi k t cn c khng c trong b m th lung Buf f erlnputstream s t ng tm d liu trn da a vo, ta khng cn phi quan tm n iu ny.Thng th vic dng b m ch yu dnh cho cc thao tc i vi tp tin, nhng ta vn c th dng n vi bt k lung con no khc c dn xut t lp Inputstream bi v Buf f erelnputstream l mt lung trung gian.Chng hn kt ni tp tin "HelloWord. java" vo lung Buf f erlnputstream ta c th vit lnh nh sau :11 To lung t tp tinFileInputStream f=new Filelnputstrean("HelloWord. java");/ / Gn lung dc tp tin vo b mBufferedlnputstream sl= Bufferedlnputstream(f) ;hoc s dng lnh gn hn :Buf f eredlnputstream sl= Buf f erelnputstream (new Filelnputstreamt "HelloWord. java") )Sau ta c th c d liu t lung sl thoi mi khng khc g nh dang lm vic trc tip vi tp tin vy. Di dy l v d minh ha. chng trnh c d liu t tp tin bng b m.V d 8-9: BufferedFileApp.javaimport j ava. io. * ; public class Euf feredFileApp { public static void main (String args[]) throws IOException{ Buf Jeredlnputstream bstream = new Buf f eredlnputstream( new Filelnputstream("HelloWorld.java")); int ch=0; while ((ch=bstream.read())!= -1) { System.out.print((char)ch);>bstream.close();}}Bin dch:C: \Learning>javac BufferodFileApp. javaChy chng trnh:c:\Learning>java BuffereiFileApp public class HelloWorld { public static void main (String args[] ) { System.out .printing "Hello World" );}

Maaam174Chng 8 : X l lung v tp tin}Chng trnh trn cng tng t chng trnh ReadPleApp. java m ta d xem qua phn File Input stream, ch c mt diu khc l sau khi m tp tin ta li gn tp tin vo lung bstream thuc lp Buf f eredlnputstream dng lm b m. Chng trnh ny ch c mt tp tin nh v cho in ra, nn c l khng thy c khc bit g so vi vic khng dng b m. Tuy nhin nu ta thao tc trn tp tin ln (nh tp tin ti liu di t 100-200 trang chng hn) th s thy c s khc bit ny.15. LP BUFFEREDOUTPUTSTREAMNgc vi vic c d liu t tp tin ln, qu trnh ghi d liu xung tp tin cng vy, nu ta c ghi lin tc tng k t mt xung tp tin vt l trn a cng th s t ra chm chp. Java cung cp c ch ghi vo b m, ta ch vic kt ni tp tin cn a d liu ra vi lung Buf feredOutputstream l c. Sau khi kt ni chng trnh c lin tc ghi nhng g cn thit vo b m, i tng ca lung Buffereoutputstream s bit cch a d liu vo tp tin.Tuy nhin, mt iu cn lu l khng phi c ghi vo b m l d liu an ton nm trn tp tin m phi mt mt thi gian sau (chng hn khi b m y hay h thng ang trong trng thi rnh ri) th d liu mi c ghi. Do d nu mun chc chn l ton b d liu trong b m d c dy xung tp tin hy gi thm phng thc flush () ca lp BufferedOutputstream.Thng th vic dng b dm ny ch yu dnh cho cc thao tc i vi tp tin. nhng ta vn c th dng n vi bt k lung con no khc c dn xut t lp Outputstream bi v Buf f eredoutstream cng l mt lung trung gian.Di y l v d minh ha cho cch dng lung Buf f eredoutputstream cng vi lung Buf f eredlnputstream. Chng trnh dng copy d liu t tp tin ny sang tp tin khc.V d 8-10: BufferedFileAppJavaimport j ava. io. * ; public class CopyFileApp { public static void main (String args []) throws IOException {/ /Kim tra tn tp tin if (args.length!=2) {System.out .println( "Usage : java CopyFileApp ") ; return;>/1 Ly tn tp tin ngun u ch String SourceFile=args [0] ;String DestFile =args[l]; / / To b m c d liu t tp tin ngun Buf feredlnputstream inFile = new Buf ferelnputstream(new FilelnputStream(SourceFile) ) ; /1Ly kch thc tp tin ngun int FileSize = inFile.available();11 To b m ghi d liu vo tp tin chBuf f eredoutputstream outFile = new Buf fere0utputstream( new FileOutputStream(DestFile)) ;11 Chuyn d liu int ch=0;while ((ch=inFile.read()) !=-1) { outFile.write(ch);1}System.out .println(FileSize+" bytes already copy") ; inFile.close(); outFile.close();}>Bin dch:C: \Learning> javac CopyFileApp. javaChy chng trnh:C: \Learning>java CopyFileApp HelloWorld java C: \HelloTest.txt 118 bytes already copy chy chng trnh ny ta phi cung cp tn v ng dn y cho tp tin ngun (l tp tin mun sao chp) v tp tin ch (tp tin s chp d liu ln). Nhm gip cho chng trnh n gin ta khng xt n cc trng hp li nh khng tm thy tn tp tin, tp tin b li v vt l trn a cng ... ( hy th t mnh dng khi lnh try {