2011-04-20 54 views
1

我有一个有符号的值,例如-7368817 当我投它以字节这将是这样的:-113 我将它转换为无符号字节再见& 0xff,它将会像现在 我操纵这个字节值和我后想整个回归!得到新字节的有符号整数。 :)signed int to unsigned byte,反之亦然

更新

原委:

我有一个形象,这是8位的深度和灰度!这意味着所有像素使用1个字节

BufferedImage image = ImageIO.read(new File("my_grayscal_8bit_photo.jpg")); 

int intPixel = image.getRGB(1, 1); 

现在提出我需要一些位操作在这个像素,但因为它是INT我必须将它先字节:

byte bytePixel = (byte) intPixel; 

,并使其签名:

int intPixel2 = bytePixel & 0xff; 

现在我做我的位操作,并希望将其转换为int,做:

image.setRGB(1, 1, neworiginalint); 
+3

我假设你知道java没有无符号类型(除char之外) – Bozho 2011-04-20 08:02:26

+0

而且一个字节只能保存256个值,即8位的2^8。恕我直言,你可以使用字节作为无符号,如果你想,你只是不会从Java获得很多帮助。 – 2011-04-20 08:06:14

+0

顺便说一句:如果你可以将每个可能的值放入一个1字节的'byte'中,那么有一个4字节的'int'会是什么意思;) – 2011-04-20 08:10:00

回答

4

getRGB(int x, int y)方法总是返回在TYPE_INT_ARGB颜色模型int像素。要手动提取红色,绿色,蓝色和alpha值,你可以做到这一点的像素:

int pixel = image.getRGB(1, 1); 
int a = (pixel >> 24) & 0xFF; 
int r = (pixel >> 16) & 0xFF; 
int g = (pixel >> 8) & 0xFF; 
int b = pixel & 0xFF; 

或者使用Color(int rgba, boolean hasalpha)构造为方便起见(以性能为代价)。一旦你操纵的红色,绿色,蓝色和alpha值(在0到255的范围),你可以重组它们放回一个int设置像素:

int newPixel = (a << 24) | (r << 16) | (g << 8) | b; 

使用你所提到的-7368817像素这个代码,alpha是255(所以不透明),红色,绿色和蓝色的值都是143.因为你处理的是灰度,你可以选择红色,绿色或蓝色来获取灰度值。然而,在设置像素时,您将设置所有三个像素以保持灰度,因为它是RGB。你可以快捷有点像这样:

int pixel = image.getRGB(1, 1); 

// extract your gray value from blue, assume red and green are same 
int gray = pixel & 0xFF; 

// this method does your manipulation on the gray value, 0 to 255 
gray = manipulate(gray); 

// recombine back into int, preserving the original alpha 
int newPixel = (pixel & 0xFF000000) | (gray << 16) | (gray << 8) | gray; 

// now you can set your new pixel 
image.setRGB(1, 1, nexPixel); 

基本上诀窍是使用int为你的无符号字节。只要确保你保持从0到255的值,一切都应该正常工作。

1

你问的是如何处理有符号整数中最不重要的字节,而不接触更重要的字节?
这是可以做到这样的:

int i = -7368817; // 0xFF8F 8F8F 
int b = i & 0xFF; // "signed byte", = 0x8F = 143 
b += 0x2C; // your manipulation, result = 0xBB 
i = (i & 0xFFFFFF00) | (b & 0xFF); // result of LSB modification = 0xFF8F8FBB 

或一步到位:i = (i & 0xFFFFFF00) | ((i + 0x2C) & 0xFF);,如果它是一个简单的操作。

如果操作永远不能产生溢出,你可以简单地做对整个INT:
i ^= 0x34; // i = 0xFF8F8FBB