我有一个签名值,例如的 -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);
答案 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