在JAVA中将像素从int转换为无符号字节

时间:2014-10-30 15:50:17

标签: java int byte pixels unsigned

我试图将我从黑白图像的getRGB函数获得的像素转换为无符号字节,我已阅读并更正,如果我错了,java中的getRGB函数返回整数值,那么我想要什么要做的是看到0-255的值不是我得到的函数的负整数值。我没有成功地试过这个:

   int width;
   int height;
   byte extract;
   int asign;
   int matrix[][];

 for ( i = 0; i < height; i++)
     {
        for ( j = 0; j < width; j++) 
        {
            extract =(byte)(xray.getRGB(j, i));
            asign = (int)extract;
            //asign = asign & 0xff;
            asign = asign + 128;
            matrix[i][j] = asign;


        }
     }

请注意,xray是一个推荐图像。 希望你能帮我解决这个问题。正如你所看到的,我已经尝试过使用模板,我也尝试过在模拟后添加128值。

2 个答案:

答案 0 :(得分:0)

好吧,getRGB()会返回一个签名的int,但它是一个32位int,表示alpha和R,G,B值。最重要的字节是alpha,如果它完全不透明,那么它将是255,这意味着你最终会得到负int

如果要屏蔽alpha值,可以使用

执行此操作
matrix[i][j] = xray.getRGB(j,i) & 0xFFFFFF;

将摆脱高阶字节。这将为您留下一个包含像素RGB值的正值。

小心你之后用它做什么:如果你稍后尝试使用它来设置一个像素的颜色,你最终可能会将alpha值设置为0(现在你已经将它屏蔽了),所以你会得到一些完全透明的东西(也就是看不见的东西)。

如果它是黑白图像,并且由于某种原因你只得到-128到127的值,那么或多或少同样的技巧适用于使它无符号。实际上与上面的行完全相同,但你也可以缩短掩码:

matrix[i][j] = xray.getRGB(j,i) & 0xFF;

这意味着您的代码中不需要任何if - else即可使其正常运行,并且您不需要extractasign个变量。

答案 1 :(得分:0)

试试这个

    extract =(byte)(xray.getRGB(j, i));
    if(extract < 0){
       asign = extract + 256;  // Add the total number of values in byte if extract is negative
    }
    else{
       asign = extract;        // You don't need to type cast it to int explicitly
    }
    matrix[i][j] = asign;
相关问题