有符号整型转换为无符号字节,反之亦然



我有一个带符号的值,例如-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;

现在我要进行位操作并将其转换为整型,然后执行:

image.setRGB(1, 1, neworiginalint);

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,一切都应该正常工作。

您是否在询问如何在不触及更重要的字节的情况下操作有符号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

相关内容

  • 没有找到相关文章

最新更新