【问题标题】:Java, image is changing to wrong rgb valuesJava,图像正在更改为错误的 rgb 值
【发布时间】:2016-03-08 07:04:10
【问题描述】:

我编写了一个 java 代码将黑白图像的所有红色值更改为 255,因此输出将是红色图像。 但它不是红色,而是输出更亮的图像。 我做错了什么?

 File bwgFile = new File("X:/Java/Documents/NetBeansProjects/colour/input/bwg.png");
BufferedImage bwgImage = ImageIO.read(bwgFile);
int width=bwgImage.getWidth();
int height=bwgImage.getHeight();
for(int w=0; w<width; w++){
  for(int h=0; h<height; h++){
      int pixel = bwgImage.getRGB(w,h);
      Color bwg = new Color(pixel);
      int c=bwg.getRed();
      Color red = new Color(255,c,c);
      int cpixel = red.getRGB();
      bwgImage.setRGB(w,h,cpixel);
  }
}
    ImageIO.write(bwgImage, "png", new File("X:/Java/Documents/NetBeansProjects/colour/output/c.png")); 

input output

编辑: 我发现了问题所在,显然,当输入是灰度图像时,它会尝试使输出也成为灰度图像,从而在去除蓝色和绿色时使其更暗,在添加红色时使其更亮。不使用灰度图像作为输入修复了它。

【问题讨论】:

  • 原因颜色通道表示颜色的亮度?你仍然有你的绿色和蓝色通道。如果你都将它们设置为 255,你会得到白色。
  • 我没有将它们全部设置为 255,只有红色。
  • 如果您查看输出图像,您会发现图像不是白色的。 (如果你没有注意到,我已经包含了图片的链接。)

标签: java colors rgb bufferedimage javax.imageio


【解决方案1】:

如果我了解您要做什么,您是在尝试创建灰度图像,但它是“redscale”,仅使用红色阴影。因此,您需要计算每个像素的灰度常数。

来自维基百科 (Greyscale),像素 Y 的亮度 = 0.2126R + 0.7152G + 0.0722B。所以,试试这个

int pixel = bwgImage.getRGB(w,h);
Color bwg = new Color(pixel);
float c = (0.2126f * bwg.getRed() + 0.7152f * bwg.getGreen() + 0.0722f * bwg.getBlue());
int cc = (int)Math.round(c);
Color red = new Color(cc, 0, 0);
int cpixel = red.getRGB();
bwgImage.setRGB(w,h,cpixel);

或者,您可以简单地保留红色分量并将绿色和蓝色设置为 0。这将只留下每个像素的“红色”。

int pixel = bwgImage.getRGB(w,h);
Color bwg = new Color(pixel);
int c=bwg.getRed();
Color red = new Color(c,0,0);
int cpixel = red.getRGB();
bwgImage.setRGB(w,h,cpixel);

注意:上述解决方案仅适用于未使用IndexColorModel 的图像。您可以使用 BufferedImage 的getColorModel() 检查颜色模型。对于IndexColorModelsetRGB() 不能直接工作,而是根据 HaraldK 的评论在索引中选择最接近设置颜色的颜色。要使用IndexColorModel 获得所需的图像效果,您可以使用 TYPE_INT_ARGB 创建一个新的 BufferedImage:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

然后,将计算出的像素颜色写入此新图像并保存新图像。

【讨论】:

  • 线程“main”java.lang.IllegalArgumentException 中的异常:颜色参数超出预期范围:java.awt.Color.testColorValueRange 处的红色(Color.java:310)处的 java.awt.Color。 (Color.java:395) at java.awt.Color.(Color.java:369) at colour.Colour.main(Colour.java:50) C:\Users\Emma\AppData\Local \NetBeans\Cache\8.1\executor-sn-ps\run.xml:53:Java 返回:1 BUILD FAILED(总时间:0 秒)
  • @ergoforce,抱歉,删除了第 3 行的 * 255。原始值已经在 0 到 255 之间。
  • 我也尝试了你的第二个建议,但我仍然得到一个灰度图像,即使每个像素的 Blue 和 Green 值应该为 0,但明显比输入更暗。
  • 与改进的第一个答案相同的结果,我得到一个更暗的灰度图像
  • 我发现了问题所在,虽然我不明白为什么会出现问题,显然当输入是灰度图像时,它会尝试使输出也成为灰度图像,从而使其更暗当蓝色和绿色被移除时,当红色被添加时更亮。不使用灰度图像作为输入修复了它。感谢您改进的代码,您帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多