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