我的问题:我希望能够更改资源图像的亮度并将其作为 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));
它工作得很好,但显然它并没有变暗。
我认为我需要的:一些有助于理解offset
、scaleFactor
和filter
方法的含义/do,以及因此为亮度变量提供的数字。
任何帮助将不胜感激!谢谢!
最佳答案
文档说:
缩放操作的伪代码如下:
for each pixel from Source object {
for each band/component of the pixel {
dstElement = (srcElement*scaleFactor) + offset
}
}
它只是对每个像素进行线性变换。该转换的参数是 scaleFactor
和 offset
。如果你想要 100% 的亮度,这个转换必须是一个标识,即 dstElement = srcElement
。设置 scaleFactor = 1
和 offset = 0
就可以了。
现在假设您想让图像更暗,如您所说的那样亮度为 75%。这相当于将像素值乘以 0.75。您需要:dstElement = 0.75 * srcElement
。因此设置 scaleFactor = 0.75
和 offset = 0
应该可以解决问题。您的值的问题是它们从 0 到 100,您需要使用 0 到 1 之间的值。
关于java - 如何改变图像的亮度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12980780/