2011-01-26 73 views
36

Vì vậy, trong một BufferedImage, bạn nhận được một số nguyên duy nhất có giá trị RGB được biểu thị trong đó. Cho đến nay tôi sử dụng những điều sau đây để lấy các giá trị RGB từ nó:Chuyển đổi giá trị RGB thành Số nguyên

// rgbs is an array of integers, every single integer represents the 
// RGB values combined in some way 
int r = (int) ((Math.pow(256,3) + rgbs[k])/65536); 
int g = (int) (((Math.pow(256,3) + rgbs[k])/256) % 256); 
int b = (int) ((Math.pow(256,3) + rgbs[k]) % 256); 

Và cho đến nay, nó hoạt động.

Những gì tôi cần làm là tìm ra cách lấy số nguyên để tôi có thể sử dụng BufferedImage.setRGB(), vì nó có cùng loại dữ liệu mà nó đã cho tôi.

Trả lời

68

Tôi nghĩ rằng mã này là một cái gì đó như:

int rgb = red; 
rgb = (rgb << 8) + green; 
rgb = (rgb << 8) + blue; 

Ngoài ra, tôi tin rằng bạn có thể nhận được các giá trị cá nhân sử dụng:

int red = (rgb >> 16) & 0xFF; 
int green = (rgb >> 8) & 0xFF; 
int blue = rgb & 0xFF; 
+0

Tôi không nghĩ bạn cần một int trên hai dòng thứ hai. Và dòng thứ ba được cho là "rgb = ...", đúng không? –

+0

Nó là một số nguyên duy nhất. Một số nguyên chứa 32 bit. 8 bit đầu tiên cho giá trị alpha (bằng 0). 8 tiếp theo cho màu đỏ, sau đó 8 tiếp theo cho màu xanh lá cây và 8 tiếp theo cho màu xanh. Thử nó. Nếu đầu ra cuối cùng bằng với đầu vào ban đầu thì bạn biết việc chuyển đổi đã được thực hiện đúng. – camickr

+0

Erm, tôi nghĩ nó sẽ phụ thuộc vào độ sâu màu. Ví dụ của bạn trông giống như màu 24-bit với tôi (8 bit cho mỗi kênh) - đó là những gì 'BufferedImage' mong đợi? –

22
int rgb = ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff); 

Nếu bạn biết rằng r bạn, g, và giá trị b không bao giờ> 255 hoặc < 0 bạn không cần & 0x0ff

Addit ionaly

int red = (rgb>>16)&0x0ff; 
int green=(rgb>>8) &0x0ff; 
int blue= (rgb) &0x0ff; 

Không cần nhân rộng.

17

nếu r, g, b = 3 giá trị số nguyên từ 0 đến 255 cho mỗi màu

sau đó

rgb = 65536 * r + 256 * g + b; 

giá trị rgb duy nhất là giá trị tổng hợp của r, g, b kết hợp cho một tổng số 16777216 sắc thái có thể.

+1

Tôi sẽ sửa đổi điều này thành 'rgb = 0xFFFF * r + 0xFF * g + b;' để dễ đọc –

+2

0xFF = 255. Phải là 0x100. Tương tự như vậy cho 0XFFFF – geoxile

20
int rgb = new Color(r, g, b).getRGB(); 
1

Để nhận các giá trị màu riêng lẻ, bạn có thể sử dụng Màu như sau cho pixel (x, y).

import java.awt.Color; 
import java.awt.image.BufferedImage; 

Color c = new Color(buffOriginalImage.getRGB(x,y)); 
int red = c.getRed(); 
int green = c.getGreen(); 
int blue = c.getBlue(); 

trên sẽ cung cấp cho bạn các giá trị số nguyên của Red, Green và Blue trong phạm vi từ 0 đến 255.

Để thiết lập các giá trị từ RGB bạn có thể làm như vậy bằng cách:

Color myColour = new Color(red, green, blue); 
int rgb = myColour.getRGB(); 

//Change the pixel at (x,y) ti rgb value 
image.setRGB(x, y, rgb); 

Xin lưu ý rằng các thay đổi ở trên thay đổi giá trị của một pixel. Vì vậy, nếu bạn cần thay đổi toàn bộ giá trị của hình ảnh, bạn có thể cần phải lặp qua hình ảnh bằng cách sử dụng hai cho vòng lặp.

Các vấn đề liên quan