2015-12-09 67 views
0

首先,感谢阅读。颜色在java中的缩放图像重新缩放

我正在写一个类,它从2D双数组(从代码中的kDEvalue)返回一个图像。 但是,由于很多值(256 * 256)在非常小的范围(-1至1)内变化,所以我无法使用默认颜色缩放比例(如果使用阵列中的值,则全部为黑色)。

BufferedImage image = new BufferedImage(kDEvalues.length, kDEvalues[0].length, BufferedImage.TYPE_INT_RGB); 
     for (int x = 0; x < 256; x++) { 
      for (int y = 0; y < 256; y++) { 
       image.setRGB(x, y, (255*(int)Math.round(kDEvalues[x][y]))/100); 
      } 
     } 


     try { 
      ImageIO.write(image, "jpg", new File("CustomImage.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

在这种情况下,我如何重新调整灰度级的颜色,以便我可以看到该值的变异性?在此先感谢

回答

0

你差点就在这里:

image.setRGB(X,Y,(255 *(INT)Math.round(kDEvalues [X] [Y]))/ 100) ;

对于RGB值的表达式有三个错误。首先,你绕一圈,然后乘。这会降低你的小数值的任何分数,它应该是相反的方式。其次,您只为一个颜色通道(蓝色通道)创建一个值,并且不检查溢出。

尝试这样:

int gray = (int) Math.round((kDEvalues[x][y] - (-1)) * 127.5); 
// limit range to 0-255 
gray = Math.min(gray, 255); 
gray = Math.max(gray, 0); 
// copy gray value to r, g and b channel 
int rgb = (gray << 16) | (gray << 8) | gray; 
image.setRGB(x, y, rgb); 

第一个操作是价值扩展到0-255。既然你说你的值在-1到1的范围内,调整这些值使得下限为零(通过减去下限)。然后乘以一个高斯值变为255的因子(thats(1 - ( - 1))* 127.5 = 255)。

为了安全起见,请将结果值剪切到0-255(Math.min/max表达式)。

然后通过将灰度值设置为所有3个颜色通道来复制RGB中的灰度值。格式记录在javadoc中,并且位移只是将灰度值放在int内的正确位置。

+0

感谢您的答案,但现在它全是灰色的。我认为范围比我上面提到的要小得多。它是0到-1E-3 – user5497424