java - 有符号整数到无符号字节,反之亦然

标签 java byte int pixel unsigned

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

相关文章:

java - 将包含十六进制 0x00 的字符串复制到剪贴板

integer - 用 byte 或 Short 模拟 int 变量

mysql - 如何在 mysql 中将 bigint 更改为 int,表具有外键

haskell - 在 Haskell 中将 Int 划分为 Int

java - 在 JDBC 应用程序中向前和向后移动 ResultSet 游标

java - log4j 中的记录器变得为空

java - 如何在 pom.xml 中递归更新依赖版本

Java XML 数字字符引用

java - 按位或未产生预期结果

java - boolean 值与 boolean 值字节