Câu hỏi về JAVA

Phan Minh Khuê
(pmk)

Thành viên (sai email)
Em có bài tập Java Programming - Về Image

Phải import 1 image - rồi Invert colors (xanh -> đỏ, etc..); biến ra đen trắng; Lộn ngược lộn xuôi... etc...

Làm việc với Images kiểu thể trong Java chắc chỉ dùng mấy cái methods trong class PixelGrabber phải không ạ? Nhưng mà class này nó nói khó hiểu quá, ko giải thích parameters gì hết. (em dùng JCreator)

Có ai biết link nào trên mạng giải thích hoặc có nhiều ví dụ về Image, pixel, etc... hoặc Link hay hay về Java thì cho em biết với.
Hoặc nếu rảnh thì giải thích hộ em thêm về cái class đấy được không ạ?
;) (cười nịnh nọt)

Em cảm ơn nhiều ạ
 
Đầu tiên là import, dùng createImage trong java.awt.Toolkit để đọc vào, sau đó dùng MediaTracker để make sure it's loaded, nếu dùng Swing thì có thể thay bằng ImageIcon, không cần MediaTracker nữa.

PixelGrabber có constructor như sau:
public PixelGrabber(Image img, int x, int y, int w, int h, int[] pix, int off, int scansize)

Trong đó x,y là tọa độ; w, h là width, height; pix[] là mảng chứa các giá trị RGBA (red, green, blue, alpha) của image; off với scansize em không cần quan tâm lắm.

Khi implement có thể dùng đoạn code chuẩn như sau:
public void handleSinglePixel(int x, int y, int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel ) & 0xff;
// từ đây sửa đổi RGB tùy ý, với giá trị trong khoảng [0,255]
// sau đó encode lại cho MemoryImageSource
pixel = (alpha << 24) | (red << 16) | (green << 8) | blue;
}

Còn để rotate thì dùng AffineTransformOp
Em vào http://java.sun.com để xem chi tiết về các API.
 
Chỉnh sửa lần cuối:
Em cảm ơn nhiều ạ, có hiểu thêm được một chút nhưng không biết có hỏi thêm được mấy câu không?

- Đoạn này
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel ) & 0xff;

nếu thay &0xff (????) = &255 thì khác nhau thế nào? (em thấy có code viết thế, quan trọng là ko hiểu cái 0xff là gì) - mà thực ra cái operator & có nghĩa gì ở đây ạ?
Nếu chỉ dùng R B G ko mà ko dùng Alpha có được ko ạ?
 
0xff là biểu diễn dưới dạng hệ cơ số 16, giá trị trong hệ thập phân thì nó chính là 255, do đó em cũng có thể thay bằng 255. Trong Java, giá trị int luôn luôn có độ rộng là 32 bits, RGBA encoding được stored trong một giá trị int nên bản thân mỗi R,G,B,A có độ rộng 8 bits, tương đương với 2**8 = 256 giá trị, nằm trong đoạn [0,255]. & là bitwise operator, có nghĩa là AND, & ở đây không giống như reference trong C/C++ nên em nhớ viết cách ra. Em có thể không dùng blue, chứ alpha (transparency value) lại là most significant 8 bits được sử dụng. Từ lần sau cứ thêm một câu hỏi là phải kèm theo một điều kiện chứ khuyến mại miễn phí thế này đủ rồi :) Có lẽ thế nhỉ.
 
Em cũng chẳng muốn cảm ơn suông thế này nhưng biết làm cách nào được bây giờ.

Anh có gợi ý gì không ạ?



;)
 
Back
Bên trên