ken*_*dds 10 java swing image-manipulation brightness imageicon
我的问题:我希望能够改变资源图像的亮度,并将其三个实例作为ImageIcons.一个亮度为50%(如此暗),另一个亮度为75%(亮度稍高),最后另一个亮度为100%(与原始图像相同).我也想保持透明度.
我尝试了什么:我已经四处寻找,看起来最好的解决方案是使用RescaleOp,但我无法理解.我不知道scaleFactor和偏移是什么.这是我尝试过的代码.
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));
}
Run Code Online (Sandbox Code Playgroud)
电话会是这样的:
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).
Run Code Online (Sandbox Code Playgroud)
该代码会发生什么:图像显示为"隐形"我知道它就在那里,因为它位于JLabel上,上面有鼠标点击事件,并且工作得很好.如果我只是跳过亮度变化部分并说它setRegularIcon(new ImageIcon(Button.class.getResource(imageLocation));工作正常,但显然它不是更暗.
我认为我需要的是:有些人帮助理解什么offset,scaleFactor和filter方法的意思/做法,以及因此为亮度变量提供的数字.
任何帮助将不胜感激!谢谢!
医生说:
重新缩放操作的伪代码如下:
for each pixel from Source object {
for each band/component of the pixel {
dstElement = (srcElement*scaleFactor) + offset
}
}
Run Code Online (Sandbox Code Playgroud)
它只是每个像素的线性变换.该转换的参数是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之间的值.
| 归档时间: |
|
| 查看次数: |
15900 次 |
| 最近记录: |