BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HCM ĐỒ ÁN MÔN HỌC ĐỒ HỌA MÁY TÍNH JAVA GRAPHIC 2D Ngành CÔNG NGHỆ THÔNG TIN Giảng viên hướng dẫn Ths NGUYỄN THỊ ANH THƯ Sinh viên thực hiện NGUYỄN QU[.]
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HCM ĐỒ ÁN MÔN HỌC ĐỒ HỌA MÁY TÍNH JAVA GRAPHIC 2D Ngành : CƠNG NGHỆ THƠNG TIN Giảng viên hướng dẫn : Ths NGUYỄN THỊ ANH THƯ Sinh viên thực MSSV: 16111060130 Sinh viên thực MSSV: 16111060132 Sinh viên thực MSSV: 16111060136 Sinh viên thực MSSV: 16111060459 Sinh viên thực MSSV: 16111060133 : NGUYỄN QUANG HUY Lớp: 16DTHA1 : PHẠM ĐẶNG ĐỨC HUY Lớp: 16DTHA1 : ĐOÀN QUANG KHẢI Lớp: 16DTHA1 : NGUYỄN LÊ HOÀNG HUY Lớp: 16DTHA2 : TRƯƠNG MINH HUY Lớp: 16DTHA2 TP Hồ Chí Minh, 2019 c MỤC LỤC Đề mục Trang Trang bìa MỤC LỤC LỜI MỞ ĐẦU CHƯƠNG GIỚI THIỆU VỀ GRAPHICS 2D TRONG JAVA .4 1.1 Định nghĩa graphics 2D 1.2 Thao tác 1.3 Hình ảnh hai mơ hình CHƯƠNG GIỚI THIỆU VỀ SHAPES TRONG JAVA .5 2.1 Định nghĩa shapes java .5 2.2 Gói Java java.awt.geom 2.3 Lớp Line 2D 2.4 Lớp Point2D .6 2.5 Các lớp khác java.awt.geom .7 2.6 Lớp Path2D .8 2.7 Thêm hình img java CHƯƠNG GIỚI THIỆU VỀ STROKE AND FILL 10 3.1 Định nghĩa 10 3.2 BasicStroke .11 CHƯƠNG GIỚI THIỆU VỀ TRANSFORMS 12 4.1 Định nghĩa: .12 CHƯƠNG GIỚI THIỆU VỀ BUFFEREDIMAGE AND PIXEL .15 5.1 Định nghĩa 15 CHƯƠNG DEMO 18 6.1 java2d/GraphicsStarter.java 18 6.2 java2d/AnimationStarter.java 19 6.3 java2d/EventsStarter.java 19 6.4 java2d/PaintDemo.java 20 6.5 java2d/JavaPixelManipulation.java 20 CHƯƠNG KẾT LUẬN RÚT RA .20 CHƯƠNG PHÂN CÔNG CÔNG VIỆC VÀ TÀI LIỆU THAM KHẢO 21 c c LỜI MỞ ĐẦU Theo xu hướng thời đại cộng nghệ 4.0 nay, ngành công nghệ thông tin ngành quan trọng đường hội nhập phát triển Sản phẩm công nghệ chịu đánh giá khắc khe từ phía người dùng, đặc biệt sản phầm đồ họa nhận nhiều đánh giá từ người dùng Xuất phát từ lý trên, với hướng dẫn cô Nguyễn Thị Anh Thư, chúng em thực nghiên cứu graphics 2D để vận dụng kiến thức tự tìm hiểu từ nguồn tài nguyên có sẵn, xây dựng tự Games giải trí Do chưa có nhiều kinh nghiệm thực tiễn, nên đề tài thực em nhiều thiếu sót, em mong nhận đánh giá nhận xét thầy để đề tài hoàn thiện Chúng em xin chân thành cảm ơn! c CHƯƠNG GIỚI THIỆU VỀ GRAPHICS 2D TRONG JAVA 1.1 Định nghĩa graphics 2D Graphics2d hình thức đồ họa trực quan sử dụng hình ảnh để trình bày thông tin, liệu kiến thức thông tin phức tạp nhanh chóng rõ ràng giúp người đọc dễ hiểu Java ngôn ngữ hướng đối tượng API định nghĩa tập hợp lớn lớp, Thực tế thao tác vẽ API đồ họa ban đầu hầu hết chứa lớp có tên Đồ họa Trong API hơn, thao tác vẽ phương thức lớp có tên Graphics2D, lớp Đồ họa, tất hoạt động vẽ ban đầu có sẵn 1.2 Thao tác Một hệ thống đồ họa cần nơi để vẽ Trong Java, bề mặt vẽ thường đối tượng lớp JPanel, đại diện cho khu vực hình chữ nhật hình Lớp JPanel có phương thức có tên paintComponent () để vẽ nội dung Để tạo bề mặt vẽ, bạn tạo lớp JPanel cung cấp định nghĩa cho phương thức paintComponent () Tất vẽ nên thực bên paintComponent (); cần thay đổi nội dung vẽ, bạn gọi phương thức Bảng điều khiển repaint () để kích hoạt lệnh gọi paintComponent () 1.3 Hình ảnh hai mơ hình Phương thức paintComponent () có tham số loại Đồ họa, tham số truyền cho phương thức thực đối tượng loại Graphics2D truyền kiểu Graphics2D để có quyền truy cập vào khả đồ họa tiên tiến Vì vậy, định nghĩa Phương thức paintComponent () thường trông giống này: Bảo vệ void paintComponent (Đồ họa g) { Đồ họa2D g2; c g2 = (Đồ họa2D) g; // Nhập kiểu tham số vào Graphics2D // Vẽ g2 } Trong phần cịn lại phần này, tơi giả sử g2 biến kiểu Graphics2D thảo luận số điều mà bạn làm với Để làm ví dụ đầu tiên, tơi lưu ý Graphics2D hỗ trợ khử cưa, khơng bật theo mặc định Nó kích hoạt bối cảnh đồ họa g2 với lệnh đáng sợ g2.setRenderingHint (RenderingH gợi ý.KEY ANTIALIASING, RenderingH gợi ý.VALUE ANTIALIAS ON); Đối với ví dụ đơn giản đồ họa chương trình Java hồn chỉnh, bạn xem mẫu: Ví dụ : Các chương trình java2d / GraphicsStarter.java java2d / AnimationStarter java Khung tối thiểu để vẽ hình ảnh tĩnh hoạt hình, tương ứng, sử dụng Graphics2D Chương trình java2d / EventsStarter.java khung tương tự để làm việc với chuột khóa CHƯƠNG GIỚI THIỆU VỀ SHAPES TRONG JAVA 2.1 Định nghĩa shapes java Đồ họa ban đầu thực cách sử dụng tọa độ nguyên, với phép đo pixel Điều hoạt động tốt hệ tọa độ chuẩn, không phù hợp sử dụng tọa độ số thực, đơn vị đo hệ tọa độ không pixel Chúng ta cần định hình dạng cách sử dụng số thực Gói Java java.awt.geom cung cấp hỗ trợ cho hình dạng xác định cách sử dụng tọa độ số thực Ví dụ, lớp Line2D gói đại diện cho phân đoạn dịng có điểm cuối cho cặp số thực 2.2 Gói Java java.awt.geom Java có hai kiểu số thực: double float c Kiểu double biểu thị phạm vi số lớn số float, với số chữ số có nghĩa lớn gấp đôi loại sử dụng phổ biến Trong thực tế, giá trị double đơn giản dễ sử dụng Java Kiểu float thường có đủ độ xác cho ứng dụng đồ họa chúng có lợi chiếm khơng gian nhớ Hơn nữa, phần cứng đồ họa máy tính thường sử dụng giá trị float bên Từ kiểu trên, gói java.awt.geom thực cung cấp hai phiên hình dạng, sử dụng tọa độ kiểu float sử dụng tọa độ kiểu double 2.3 Lớp Line 2D Line2D lớp trừu tượng Nó có hai lớp con, lớp biểu thị dòng sử dụng tọa độ float lớp sử dụng tọa độ kép Phần kỳ lạ lớp định nghĩa lớp lồng bên Line2D: Line2D.Float Line2D.Double Điều có nghĩa bạn khai báo biến loại Line2D, để tạo đối tượng, bạn cần sử dụng Line2D.Double Line2D.Float: Line2D line1, line2; line1 = new Line2D.Double(1,2,5,7); // Line from (1.0,2.0) to (5.0,7.0) line2 = new Line2D.Float(2.7F,3.1F,1.5F,7.1F); // (2.7,3.1) to (1.5,7.1) Lưu ý sử dụng số kiểu float Java, bạn phải thêm “F” làm hậu tố cho giá trị Đây lý Double dễ dàng Java Để đơn giản, bạn muốn sử dụng Line2D.Double Tuy nhiên, Line2D.Float cho hiệu suất tốt chút 2.4 Lớp Point2D Lớp trừu tượng Point2D, với lớp cụ thể Point2D.Double Point2D.Float, biểu thị điểm theo hai chiều, định hai tọa độ số thực Một điểm khơng phải hình dạng; bạn khơng thể điền vào thay đổi Một điểm xây dựng từ hai số thực: new Point2D.Double(1.2,3.7) c Nếu p biến loại Point2D, bạn sử dụng p.getX () p.getY () để truy xuất tọa độ bạn sử dụng p.setX (x), p.setY (y) p.setLocation (x, y) để đặt tọa độ Nếu pd biến loại Point2D.Double, bạn tham chiếu trực tiếp đến tọa độ pd.x pd.y (và tương tự cho Point2D.Float) Các lớp khác java.awt.geom cung cấp nhiều cách tương tự để thao túng thuộc tính chúng tơi thắng cố gắng liệt kê tất chúng 2.5 Các lớp khác java.awt.geom Có loạt lớp đại diện cho hình dạng hình học, bao gồm Line2D, Oval2D, RoundRonymous2D, Ellipse2D, Arc2D Path2D Tất lớp trừu tượng lớp chứa cặp lớp con, chẳng hạn Rectangle2D.Double and Rectangle2D.Float Một số hình dạng, chẳng hạn hình chữ nhật, có nội thất lấp đầy; hình dạng có phác thảo xây dựng Một số hình dạng, chẳng hạn đường, hồn tồn chiều xây dựng Bên cạnh dịng, hình chữ nhật có lẽ hình dạng đơn giản Rectangle2D có điểm góc (x, y), chiều rộng chiều cao xây dựng từ liệu new Rectangle2D.Double(x,y,w,h) Điểm góc (x, y) định giá trị x - y tối thiểu hình chữ nhật Đối với hệ tọa độ pixel thông thường, (x, y) góc bên trái Tuy nhiên, hệ tọa độ giá trị tối thiểu y nằm cùng, (x, y) góc bên trái Các Một biến r có kiểu Rectangle2D.Double có biến thể cơng khai r.x, r.y, r.width, r.height Nếu chiều rộng chiều cao nhỏ 0, khơng có vẽ hình chữ nhật lấp đầy xây dựng Một nhiệm vụ phổ biến xác định hình chữ nhật từ hai điểm góc (x1, y1) (x2, y2) Điều thực cách tạo hình chữ nhật có chiều cao chiều rộng sau thêm điểm thứ hai vào hình chữ nhật Thêm điểm vào hình chữ nhật làm cho hình chữ nhật phát triển vừa đủ để bao gồm điểm đó: c Rectangle2D.Double r = new Rectangle2D.Double(x1,y1,0,0); r.add(x2,y2); Các lớp Line2D, Ellipse2D, RoundRonymous2D Arc2D tạo hình dạng khác hoạt động tương tự Rectangle2D Bạn kiểm tra tài liệu API Java để biết chi tiết 2.6 Lớp Path2D Nó đại diện cho đường dẫn chung tạo thành từ phân đoạn đường đường cong Bezier Các đường dẫn tạo phương thức tương tự chương trình moveTo lineTo Để tạo đường dẫn, bạn bắt đầu cách xây dựng đối tượng có kiểu Path2D.Double (hoặc Path2D.Float): Path2D.Double p = new Path2D.Double(); Đường dẫn p trống lần tạo Bạn xây dựng đường dẫn cách di chuyển bút tưởng tượng dọc theo đường dẫn mà bạn muốn tạo Phương thức p.moveTo (x, y) di chuyển bút đến điểm (x, y) mà khơng cần vẽ Nó sử dụng để xác định điểm ban đầu đường dẫn điểm bắt đầu đoạn đường dẫn Phương thức p.lineTo (x, y) vẽ đường từ vị trí bút đến (x, y), để bút (x, y) Phương thức p.close () sử dụng để đóng đường dẫn (hoặc đoạn đường dẫn) cách vẽ đường trở điểm bắt đầu Ví dụ: đoạn mã sau tạo tam giác có đỉnh (0,5), (2, -3) (-4,1): Path2D.Double p = new Path2D.Double(); p.moveTo(0,5); p.lineTo(2,-3); p.lineTo(-4,1); p.close(); Ngồi thêm đoạn đường cong Bezier vào Path2D Các đường cong Bezier thảo luận Tiểu mục 2.2.3 Bạn thêm đường cong Bezier hình khối vào Path2D p phương thức: p.curveTo( cx1, cy1, cx2, cy2, x, y ); c 10 Điều thêm đoạn đường cong bắt đầu vị trí bút kết thúc (x, y), sử dụng (cx1, cy1) (cx2, cy2) làm hai điểm kiểm soát cho đường cong Phương pháp để thêm đoạn đường cong Bezier bậc hai vào đường dẫn quadTo Nó yêu cầu điểm kiểm soát nhất: p.quadTo( cx, cy, x, y ); Khi đường tự giao nhau, phần bên xác định cách nhìn vào số quanh co Có hai quy tắc để xác định xem điểm có phải bên hay không: hỏi xem số quanh co đường cong điểm có khác khơng hay khơng, hỏi xem có phải số chẵn hay khơng Có thể đặt quy tắc quanh co sử dụng Path2D p với p.setWindingRule( Path2D.WIND NON ZERO ); p.setWindingrule( Path2D.WIND EVEN ODD ); Mặc định WIND_NON_ZERO 2.7 Thêm hình img java Cuối cùng, có lưu ý vẽ hình ảnh vào bối cảnh đồ họa Hình ảnh tải từ tập tin tạo chương trình Tơi thảo luận khả thứ hai sau phần Một hình ảnh đại diện đối tượng loại hình ảnh Trong thực tế, giả sử đối tượng thuộc kiểu BufferedImage, lớp Image Nếu img đối tượng vậy, : g2.drawImage( img, x, y, null ); Nó vẽ hình ảnh với góc bên trái điểm (x, y) (Tham số thứ tư khó giải thích, nên định null cho BufferedImages.) Điều vẽ hình ảnh chiều rộng chiều cao tự nhiên nó, định chiều rộng chiều cao khác phương thức: g2.drawImage( img, x, y, width, height, null ); Ngồi cịn có phương pháp để vẽ chuỗi văn Phương thức định chuỗi sở chuỗi (Basepoint góc bên trái chuỗi, bỏ qua “phần thụt” đuôi chữ “g” (Ý chỗ bỏ qua dấu móc xuống chữ g ý , kiểu v ) Ví dụ: c 11 g2.drawString( "Hello World", 100, 50 ); Hình ảnh chuỗi biến đổi theo cách với hình dạng khác Chuyển đổi cách để có văn hình ảnh xoay Ví dụ, xảy bạn áp dụng xoay cho số văn hình ảnh: Nguồn: sách Introduction to Computer Graphics CHƯƠNG GIỚI THIỆU VỀ STROKE AND FILL 3.1 Định nghĩa Khi có đối tượng hình khối Có thể khoanh vùng tơ điền vào hình Cơng cụ g2 cung cấp giải pháp để làm Giải pháp gọi draw Ví Dụ: g2.fill(shape); g2.draw(shape) Trong g2 tên hàm graphic2d Shape dạng dạng sau: Path2d,line2d, rectangle2d định dạng shape khác Hai cú pháp thường dùng để tạo đối tượng đối tượng hình ảnh mà vẽ lần Ví dụ: g2.draw( new Line2D Double (-5, -5, 5, )) Và đương nhiên tạo đối tượng hình dạng sử dụng lại nhiều lần c 12 Công cụ "pen" thường dùng để khoanh vùng shape có định dạng 3.2 BasicStroke Mặc định Stroke đường thẳng có độ rộng Và tính tọa độ dùng pixel Để vẽ đường thẳng có độ rộng khác cài đặt lại cú pháp: Ví dụ: g2.setStroke ( new BasicStroke ( width ) ) Biến (width) dạng float Và giới hạn biến để điều khiển shape khoanh vùng điểm cuối nơi mà đối tượng giao Ví dụ: g2.setStroke ( new BasicStroke ( 5.OF, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL ) ) Stroke fill có nghĩa đặt màu cho pixel cố định Trong java luật dùng để tơ màu pixel "paint" Paint màu đơn,1 gradients màu Giống thứ khác java Paint đc diễn tả đối tượng, paint đối tượng : g2.setPaint(paint) set paint dùng hàm g2 để giới hạn điều hành việc vẽ, pain đc thay đổi (Và có phương pháp khác g2.setColor(c) hoạt động tô màu tương tự g2.setPaint(c) Màu khối (solid color) đc diễn tả đối tượng dạng Color Đc thể bên RGBA color Màu mờ (làm mờ) tạo thành tồn diện cú pháp: New color(r,g,b) Trong đó, R,g,b số nguyên từ đến 255 thể màu đc hợp thành từ đỏ, vàng xanh dương Để có độ làm mờ phải thêm biến alpha New color(r,g,b,a) Trong a số nguyên từ 0~255 Và có hàm Color.getHSBcolor(h,s,b), để tạo màu lấy từ HSB color mode Trong trường hợp màu nền, bão hòa, độ sáng color có giá trị dạng float Và diễn tả màu trộn từ nhiều màu color.WHITE , color.RED ,và color.YELLOW Ví du: Ngồi màu khối Java class GradientPaint để điên tả đường gradient TexturePaint để diễn tả màu.(Hình ảnh màu đc sử dụng giống cách c 13 3d graphic đc gọi texture) Trong trường hợp color đuợ nạp vào pixel tùy thuộc vào tọa độ pixel Để tạo TexturePaint, bạn cần phải có đối tượng bufferedImage để rõ hình ảnh dùng bảng màu (patterns) Bạn thắc mắc để tọa độ image map hiển thị lên tọa độ hình Bằng cách định hình chữ nhật giữ lại copy Image dùng cú pháp sau: New texturePaint ( image, rect) Trong image BufferedImage, Rect Rectangle2D Bên ngồi hình chữ nhật image tiếp tục theo chiều ngang chiều dọc GradientPaint dùng form: New GradientPaint(x1,y1,color1,x2,y2,color2,cylic) X1,x2,y1,y2 dạng float Color1,color2 dạng color Cylic Boolean Gradient color thay đổi đoạn thẳng từ điểm 1(x1,y1) đến điểm 2(x2,y2) Màu color điểm cuối đầu tiền color điểm cuối thứ Màu khơng thay đổi đường thẳng vng góc với đoạn vẽ Biến Boolean cylic nói lên patterns có đc lập lại hay không CHƯƠNG GIỚI THIỆU VỀ TRANSFORMS 4.1 Định nghĩa: Java thực phương thức biến đổi hình học lớp Graphics2D Ví dụ, Gọi g2 Graphics2D, gọi g2.translate(1,3) thực phép dịch chuyển theo tọa độ (1,3) cho đối tượng vẽ sau gọi phương thức gọi Đây phương thức tương tự nói Phần 2.3: • g2.scale (sx, sy) – co dãn hệ số sx theo chiều ngang sy theo chiều dọc • g2.rotate (r) – r góc cố định đơn vị góc phương thức phải radian Một góc dương quay trục x dương theo hướng trục y dương • g2.rotate (r, x, y) – quay góc r hướng điểm (x, y) c 14 • g2.translate (dx, dy) – dịch chuyển điểm dx theo chiều ngang dy theo chiều dọc • g2.shear (sx, sy) –biến dạng theo chiều ngang sx chiều dọc sy Sự biến đổi Java biểu diễn dạng đối tượng lớp AffineTransform Ta khởi tạo phép biến đổi affine với phương thức constructor AffineTransform trns = new AffineTransform(a,b,c,d,e,f); Đối tượng trns biến đổi điểm (x,y) thành điểm (x1, y1) x1 = a*x + c*y + e y1 = b*x + d*y + f; Có thể áp dụng đối tượng trns cho bối cảnh đồ họa g2 cách gọi g2.transform(trns) Bối cảnh đồ họa g2 bao gồm biến đổi affine tại, thành phần tất biến đổi áp dụng Các lệnh g2.rotate g2.transform tùy chỉnh biến đổi Ta lấy biến đổi cách gọi g2.getTransform (), trả đối tượng AffineTransform Ta gán biến đổi cách sử dụng g2.setTransform (trns) Điều thay biến đổi g2 trns AffineTransform (Lưu ý g2.setTransform (trns) khác với g2.transform (trns); lệnh thứ thất dùng để thay biến đổi g2, lệnh thứ hai sửa đổi biến đổi cách kết hợp với trns.) Các phương thức getTransform setTransform sử dụng để triển khai mơ hình phân cấp.Mơ hình nói đến Phần 2.4, trước vẽ đối tượng, ta nên lưu lại biến đổi Sau vẽ đối tượng, khôi phục biến đổi lưu Bất kỳ biến đổi mô hình bổ sung áp dụng vẽ đối tượng đối tượng khơng có hiệu ứng bên ngồi đối tượng Trong Java, trơng giống như: AffineTransform savedTransform = g2.getTransform(); drawObject(); g2.setTransform( savedTransform ); Đối với đồ họa phân cấp, thực cần ngăn xếp biến đổi Tuy nhiên, hệ thống phân cấp triển khai chương trình con, đoạn mã c 15 phần chương trình giá trị biến cục lưu biến đổi lưu trữ ngăn xếp chương trình Thực tế, sử dụng ngăn xếp chương trình để thực ngăn xếp biến đổi lưu Ngoài phép biến đổi mơ hình, biến đổi sử dụng để gán vào phép biến đổi window-to-viewport để thiết lập hệ tọa độ sử dụng để vẽ Điều thường thực Java sau bối cảnh đồ họa tạo, trước thao tác vẽ Nó thực với phiên Java hàm applyWindowToViewportTransformation từ Tiểu mục 2.3.7 Xem chương trình mẫu “java2d / GraphicsStarter.java” ví dụ Tơi đề cập thêm lần sử dụng cho đối tượng AffineTransform: Đôi khi, bạn cần phải chuyển đổi rõ ràng tọa độ Ví dụ, tọa độ đối tượng cho (x, y), cần biết chúng thực đâu hình, theo tọa độ pixel Đó là, tơi muốn chuyển đổi (x, y) biến đổi để có tọa độ pixel tương ứng Lớp AffineTransform có phương thức để áp dụng phép biến đổi affine cho điểm Nó hoạt động với đối tượng thuộc dạng Point2D Đây ví dụ: AffineTransform trns = g2.getTransform(); Point2D.Double originalPoint = new Point2D.Double(x,y); Point2D.Double transformedPoint = new Point2D.Double(); trns.transform( originalPoint, transformedPoint ); // transformedPoint chứa chuỗi pixel tương ứng với (x,y) int pixelX = (int)transformedPoint.x; int pixelY = (int)transformedPoint.y; Có điều tơi sử dụng làm việc với chuỗi Thông thường hiển thị chuỗi hệ tọa độ chuyển đổi, muốn chuyển đổi sở chuỗi, khơng phải chuỗi Đó tơi muốn chuyển tác động đến vị trí chuỗi khơng phải kích thước xoay Để thực điều này, sử dụng kỹ thuật để lấy tọa độ pixel cho điểm gốc chuyển đổi, sau vẽ chuỗi tọa độ đó, sử dụng gốc,bối cảnh đồ họa chưa dịch Các hoạt động đảo ngược cần thiết Nghĩa là, tọa độ pixel cho (px, py), tìm điểm (x, y) chuyển thành (px, py) phép biến đổi affine c 16 cho Ví dụ: thực tương tác chuột, bạn thường biết tọa độ pixel chuột, bạn muốn tìm điểm tương ứng hệ tọa độ chọn riêng bạn Đối với điều đó, bạn cần biến đổi nghịch đảo Nghịch đảo biến đổi affine T biến đổi khác tương ứng với biến đổi ngược lại Nghĩa là, T (x, y) = (px, py) R biến đổi nghịch đảo R (px, py) = (x, y) Trong Java, thu biến đổi nghịch đảo trns AffineTransform AffineTransform inverse = trns.createInverse(); (Lưu ý cuối cùng: Các phương thức vẽ cũ trước đồ họa, drawLine, sử dụng tọa độ nguyên Điều quan trọng cần lưu ý hình dạng vẽ phương thức cũ phải chịu biến đổi giống hình dạng Line2D định với tọa độ số thực Ví dụ: vẽ dịng g.drawLine (1,2,5,7) có tác dụng tương tự vẽ Line2D có điểm cuối (1.0,2.0) (5.0,7.0) Trong thực tế, tất vẽ bị ảnh hưởng chuyển đổi tọa độ.) CHƯƠNG GIỚI THIỆU VỀ BUFFEREDIMAGE AND PIXEL 5.1 Định nghĩa Trong số ứng dụng đồ họa, hữu ích để làm việc với hình ảnh khơng hiển thị hình Gọi khung vẽ ngồi hình Bạn cần cách để nhanh chóng chép khung vẽ ngồi hình lên hình Ví dụ: thật hữu ích lưu hình ảnh hình khung vẽ ngồi hình Canvas thức hình ảnh Thay đổi hình ảnh thực khung vẽ, sau chép vào hình Một lý để làm điều bạn vẽ thêm thứ khác lên hình ảnh mà khơng thay đổi thức Ví dụ: bạn vẽ hộp xung quanh vùng chọn hình ảnh hình Bạn làm điều mà khơng làm hỏng thức khung vẽ ngồi hình Để xóa hộp khỏi hình, bạn cần chép hình ảnh canvas lên hình Trong Java, khung ảnh ngồi hình triển khai đối tượng kiểu BufferedImage BufferedImage đại diện cho vùng nhớ c 17 nơi bạn vẽ, giống hệt cách bạn vẽ lên hình Nghĩa là, bạn có bối cảnh đồ họa g2 thuộc loại Grapics2D mà bạn sử dụng để vẽ hình BufferedImage hình ảnh bạn vẽ lên hình, vào bối cảnh đồ họa khác giống bất ký hình ảnh khác, nghĩa cách sử dụng phương thức drawImage bồi cảnh đồ họa mà bạn muốn hiển thị hình ảnh Trong thiết lập điển hình có biến: Buffered OSC; (canvas ngồi hình) Graphics2D OSG; (bối cảnh đồ họa để vẽ lên khung) Các đối tượng tạo cách sử dụng, ví dụ: OSC = new BufferedImage(640,480,BufferedImage.TYPE INT RGB); OSG = OSC.createGraphics(); Hàm tạo cho BufferedImage định chiều rộng chiều cao hình ảnh với loại Kiểu cho biết màu sắc hiển thị hình ảnh cách chúng lưu trữ Ở TYPE INT RGB, có nghĩa hình ảnh sử dụng màu RGB thông thường với 8bit cho thành phần màu Ba thành phần màu cho pixel đóng gói thành số nguyên giá trị Trong chương trình sử dụng BufferedImage để lưu trữ hình ảnh hình, phương thức paintComponent thường có dạng: protected void paintComponent(Graphics g) { g.drawimage( OSC, 0, 0, null ); Graphics2D g2 = (Graphics2D)g.create(); // Draw extra stuff on top of the image } Một chương trình mẫu sử dụng kỹ thuật java2dJavaPixelManipulation.java Trong chương trình, người dùng vẽ đường, hình chữ nhật hình bầu dục cách kéo chuột Như chuột di chuyển, hình dạng vẽ điểm bắt đầu chuột vị trí Như chuột di c 18 chuyển, phần hình ảnh che lại phát mà khơng cần thay đổi hình ảnh có Trên thực tế, hình ảnh nằm khung vẽ ngồi hình hình dạng người dùng vẽ thực vẽ paintComponent nội dung khung vẽ Các hình dạng khơng vẽ vào hình ảnh thức khung vẽ người dùng nhả chuột kết thúc hoạt động kéo Nhưng lý tơi để viết chương trình để minh họa thao tác pixel, nghĩa tính tốn với thành phần màu pixel riêng lẻ Lớp BufferedImage có phương thức để đọc thiết lập màu pixel Một hình ảnh bao gồm hàng cột pixel Nếu OSC BufferedImage, thì: int color = OSC.getRGB(x,y) Lấy số nguyên biểu thị màu pixel số cột x số hàng y Mỗi thành phần màu lưu trữ trường bit giá trị màu nguyên Các màu riêng biệt thành phần trích xuất để xử lý toán tử thao tác bit Java: int red = (color >> 16) & 255; int green = (color >> 8) & 255; int blue = color & 255; Tương tự, với giá trị thành phần màu đỏ, lục lam phạm vi đến 255, kết hợp giá trị thành phần thành số nguyên sử dụng để đặt màu pixel hình: int color = (red