我有一个带符号的值,例如-7368817
当我将它转换为字节时,它将类似于:-113
我将它转换为无符号字节 bye & 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);
最佳答案
getRGB(int x, int y)
方法 always 在 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 之间,一切都会正常工作。
关于java - 有符号整数到无符号字节,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727237/