Tôi muốn làm hai việc:
- So sánh hai màu (RGB), bộ so sánh cho 1 nếu các màu giống nhau; 0 nếu các màu được so sánh nằm ở các phía đối diện của RGB (ví dụ: nếu chúng bằng nhau về mặt nào đó); đỏ hơn), khi đó sẽ cho một số từ 0 đến 1
- Trộn 2 màu trở lên với nhau sẽ tạo ra một màu mới: trộn màu xanh lam và màu vàng sẽ tạo ra màu xanh lá cây, trộn màu đỏ và xanh lá cây sẽ tạo ra màu đen, v.v.
câu hỏi:Có phần nào của API java có thể làm điều gì đó như thế này cho tôi không? Nếu không, có thư viện java nguồn mở của bên thứ 3 nào có thể hỗ trợ việc này không?
Cảm ơn.
1.
Có nhiều cách để so sánh màu sắc. Nếu bạn muốn cảm nhận sự khác biệt, hãy xem đánh giá của người dùng khác. Nếu bạn chỉ muốn một số hướng dẫn đơn giản: hãy sử dụng đoạn mã sau:
int rgb1 = ...
int rgb2 = ...
int r, g, b;
r = (rgb1 >> 16) & 0x000000ff;
g = (rgb1 >> 8) & 0x000000ff;
b = rgb1 & 0x000000ff;
r -= (rgb2 >> 16) & 0x000000ff;
g -= (rgb2 >> 8) & 0x000000ff;
b -= rgb2 & 0x000000ff;
câu trả lời kép = (r*r+g*g+b*b)/(255*255*3.0);
Nó tính toán khoảng cách Euclide và chia tỷ lệ thành phạm vi từ 0 đến 1.
2.
Cũng như có nhiều cách khác nhau để so sánh màu sắc, cũng có nhiều cách khác nhau để kết hợp màu sắc. Nó phụ thuộc vào những gì bạn muốn. Bạn có thể lấy mức trung bình, nhưng đó không phải là điều bạn muốn. Bởi vì nó sẽ làm tối màu cuối cùng.
EDIT: Đây là mã để lấy mức trung bình:
r = (rgb1 >> 16) & 0x000000ff;
g = (rgb1 >> 8) & 0x000000ff;
b = rgb1 & 0x000000ff;
r += (rgb2 >> 16) & 0x000000ff;
g += (rgb2 >> 8) & 0x000000ff;
b += rgb2 & 0x000000ff;
int trung bình = ((r/2)<<16)+((g/2)<<8)+(b/2);
Nếu bạn hơi thiên về toán học, hãy nghĩ về hành vi mà bạn thực sự đang tìm kiếm và thử đưa nó vào một công thức (hay đúng hơn là 3 công thức, một cho màu đỏ, một cho màu xanh lá cây và một cho màu xanh lam). Thật khó để chuyển đổi công thức thành mã java.
Bạn có thể đặt các giá trị r, g và b riêng lẻ thành một giá trị rgb duy nhất bằng cách sử dụng
int rgb = (r<<16) | (g<<8) |
EDIT: Lưu ý rằng máy tính sử dụng "đỏ, lục và lam", trong đó màu vàng là sự kết hợp giữa lục và lam chứ không phải ngược lại. Việc chuyển đổi là có thể, nhưng tôi chưa thực hiện được. Có lẽchuyển đổi giữa không gian màu rgb và rybCó thể hữu ích.
Tôi là một lập trình viên xuất sắc, rất giỏi!