2014-10-30 36 views
0

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

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。

回答

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的值,则可以使用或多或少相同的技巧使其无符号。事实上正是因为上述相同的线将做到这一点,但你也可以缩短面膜:

这意味着你不需要任何if - else在你的代码得到它的工作,而你不知道t需要你的变量extractasign

+0

谢谢,我还有一个问题,如果,即时通讯使用它的形象,这是一个黑白图像,它supossed包含一个矩阵,该矩阵中的所有值都介于0到255之间,对吗?我的问题是,如果内部计算机仍然看到4个通道(阿尔法,红色,绿色,蓝色)或只看到一个通道,换句话说,像素由4个值组成,或者只有一个? – 2014-10-30 17:05:08

+0

@LaloGalicia它可能被*存储*任何方式。最终,它将需要转换为整个屏幕的像素数据,但是,这将是RGB。现在,很多繁重的工作都是由显卡来完成的,CPU不必担心。所以这取决于你的意思*内部*:有很多不同的层次! – 2014-11-03 06:13:42

+0

谢谢@ chiastic-security,我会尝试你告诉我的,并让你知道我的结果:D – 2014-11-05 04:24:18

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; 
+0

谢谢,我会尽力的。我还有一个问题,如果我使用它的图像,它是一个黑白图像,它包含一个矩阵,并且该矩阵中的所有值必须介于0到255之间,对吗?我的问题是,如果内部计算机仍然看到4个通道(阿尔法,红色,绿色,蓝色)或只看到一个通道,换句话说,像素由4个值组成,或者只有一个? – 2014-10-30 17:06:29