当前位置: 首页 > 知识库问答 >
问题:

如何改变图像的亮度

晏永康
2023-03-14

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

我试过的:我到处找了找,看起来最好的解决方案是使用rescaleop,但我就是想不通。我不知道缩放因子和偏移量是怎么回事。这是我尝试的代码。

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));,它工作得很好,但显然不会更暗。

我认为我需要的是:一些帮助理解offsetscalefactorfilterhtml" target="_blank">方法的含义/功能,以及为亮度变量提供的数字。

如有任何帮助,我们将不胜感激!谢谢!

共有1个答案

蔚宏大
2023-03-14

医生说:

重新缩放操作的伪代码如下:

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之间的值。

 类似资料:
  • 问题内容: 我有图像序列。我需要这些图像的平均亮度。 第一个例子 (很慢): 第二个例子 (快) 这个例子非常快,但它改变了所有值HSV(我只需要更改V(亮度)) 问题答案: 只选择第三通道,然后修改这些元素 -

  • 问题内容: 我想降低CSS中的图像亮度。我进行了很多搜索,但所能获得的只是关于如何更改不透明度的信息,但这会使图像更明亮。谁能帮我 ? 问题答案: 您要寻找的功能是。它能够执行多种图像效果,包括亮度: 注意,这只是最近才成为CSS的功能。它是可用的,但大量的浏览器在那里将不会支持它,和那些支持它需要供应商名称(即,等)。 也可以使用SVG进行这样的滤镜效果。SVG对这些效果的支持已经建立并得到广泛

  • 我做了一个数组,所有的图像都在int中,我想在imageView中每3秒钟改变这些图像,我尝试了所有的解决方案,但显示了一些错误,我无法解决。 java文件(home.java) xml文件(home.xml)

  • 我想有相同的svg(Transfer.svg)但不同的颜色只使用css,它必须兼容IE11,Edge,FF和Chrome。 提前谢谢你。

  • 我看了其他答案,试着: 以及: 在类中,我把图像文件放在资源文件夹中,也放在与我的文件和我项目的根文件夹中,甚至在开始时包含了/符号URL字符串,但没有工作。我想知道最近有没有人尝试过并成功了?

  • 这是我想出的一段方便的代码的自我问答。 目前,还没有一种简单的方法来嵌入SVG图像,然后通过CSS访问SVG元素。使用JS SVG框架的方法多种多样,但如果您所做的只是制作一个带有滚动状态的简单图标,那么这些方法就过于复杂了。 所以这里是我想出的,我认为这是迄今为止在一个网站上使用SVG文件的最简单的方法。它的概念来自早期的文本到图像的替换方法,但据我所知,SVG从来没有这样做过。 这就是问题所在