将int签名为无符号字节,反之亦然

时间:2011-04-20 07:59:31

标签: java byte int pixel unsigned

我有一个签名值,例如的 -7368817 当我将它转换为字节时,它将类似于: -113 我将它转换为无符号字节& 0xff,它将类似于 143 现在我操纵这个字节值,之后我想要全程回来!获取新字节的有符号整数。 :)

更新

整个故事:

我的图像是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);

2 个答案:

答案 0 :(得分: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 :(得分:1)

您是否在询问如何操作signed int中最不重要的字节,而不触及更重要的字节? 这可以这样做:

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