java - 如何改变图像的亮度

标签 java swing image-manipulation brightness imageicon

我的问题:我希望能够更改资源图像的亮度并将其作为 ImageIcons 的三个实例。一个亮度为 50%(太暗),另一个亮度为 75%(稍微亮一点),最后一个亮度为 100%(与原始图像相同)。我还想保持透明度。

我的尝试:我四处搜索,看起来最好的解决方案是使用 RescaleOp ,但我就是想不通。我不知道 scaleFactor 和 offset 是什么意思。这是我尝试过的代码。

public void initialize(String imageLocation, float regularBrightness, float focusedBrightness, float pressedBrightness, String borderTitle) throws IOException {
  BufferedImage bufferedImage = ImageIO.read(ButtonIcon.class.getResource(imageLocation));
  setRegularIcon(getAlteredImageIcon(bufferedImage, regularBrightness));
  setFocusedIcon(getAlteredImageIcon(bufferedImage, focusedBrightness));
  setPressedIcon(getAlteredImageIcon(bufferedImage, pressedBrightness));
  setTitle(borderTitle);
  init();
}

private ImageIcon getAlteredImageIcon(BufferedImage bufferedImage, float brightness) {
  RescaleOp rescaleOp = new RescaleOp(brightness, 0, null);
  return new ImageIcon(rescaleOp.filter(bufferedImage, null));
}

电话会是这样的:

seeATemplateButton.initialize("/resources/templateIcon-regular.png", 100f, 75f, 50f, "See A Template");
//I think my 100f, 75f, 50f variables need to change, but whenever I change them it behaves unexpectedly (changes colors and stuff).

该代码会发生什么情况: 图像看起来“不可见”,我知道它在那里,因为它在 JLabel 上,上面有鼠标单击事件,并且工作正常。如果我只是跳过亮度变化部分并说 setRegularIcon(new ImageIcon(Button.class.getResource(imageLocation)); 它工作得很好,但显然它并没有变暗。

我认为我需要的:一些有助于理解offsetscaleFactorfilter 方法的含义/do,以及因此为亮度变量提供的数字。

任何帮助将不胜感激!谢谢!

最佳答案

文档说:

缩放操作的伪代码如下:

for each pixel from Source object {
    for each band/component of the pixel {
        dstElement = (srcElement*scaleFactor) + offset
    }
}

它只是对每个像素进行线性变换。该转换的参数是 scaleFactoroffset。如果你想要 100% 的亮度,这个转换必须是一个标识,即 dstElement = srcElement。设置 scaleFactor = 1offset = 0 就可以了。

现在假设您想让图像更暗,如您所说的那样亮度为 75%。这相当于将像素值乘以 0.75。您需要:dstElement = 0.75 * srcElement。因此设置 scaleFactor = 0.75offset = 0 应该可以解决问题。您的值的问题是它们从 0 到 100,您需要使用 0 到 1 之间的值。

关于java - 如何改变图像的亮度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12980780/

相关文章:

jquery - Jquery 调整图像大小

java - 如何直接从 Jackson JSON 中的 ObjectMapper 写入 JSON 对象(ObjectNode)?

java - Android 64k 方法在 56k 方法上限制错误

java - Java Swing 中使用索引的 For 循环

java - 在 Java 中连续重绘

java - 有没有JList的懒加载实现?

c# - 在不实际保存 jpeg 的情况下确定 jpeg 文件大小

image - ImageMagick 创建缩略图的命令

java - 如何删除docx4j中空内容的 "Click here to enter text"

java - 如何将 testNG 实例传递到另一个类