在java中对图像应用色调
我试图为我的程序创建几种类似的视觉风格,每种风格都有不同的颜色主题。为此,我实现了使用图标来表示 JCheckBox
和 JRadioButton
的不同状态。我不需要为每种可能的颜色制作一整套图标,有什么方法可以在显示图像之前只使用一组并更改图像的色调/饱和度/亮度/alpha 吗?
I am trying to create several similar visual styles for my programs, each with a different color theme. To do this, I have implemented the use of icons to represent the different states of JCheckBox
s and JRadioButton
s. Instead of making one full set of icons for every possible color, is there any way I can just take one set and change the hue/saturation/luminosity/alpha of the image before displaying it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
有一种方法,但您必须使用一些 BufferedImage 转换。创建它们后,将它们缓存或保存起来以便以后轻松重用。本质上,您希望从黑色图像(源颜色#000000)开始,该图像仅使用 Alpha 层来关闭像素(还提供平滑的抗锯齿功能)。例如,在源图像中,每个像素都是黑色,但 Alpha 通道因像素而异。
首先,阅读本文以了解一些背景信息:http://www.javalobby.org/articles/ 接下来
完成该底漆后,您需要将图像加载到 BufferedImage 中:
,您需要创建一个新的 BufferedImage 来进行转换:
本质上, setXORMode 将对您提供的颜色进行异或与源图像中的颜色。如果源图像是黑色,那么您提供的任何颜色都将按照您指定的方式写入。对于使用“0”作为 Alpha 通道的新颜色,将尊重原始 Alpha 通道值。最终结果就是您正在寻找的复合材料。
编辑:
您可以通过以下两种方式之一加载初始 BufferedImage。最简单的方法是使用 Java 较新的 ImageIO API: http:// /download.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html 将文件直接加载到 BufferedImage。该调用看起来像这样:
或者,您可以创建一个方法来使用 ToolKit 读取图像。
当然,如果您注意的话,我们必须执行与着色完全相同的操作来将图像读入缓冲图像。简而言之,如果您更改了 colorImage 方法的签名以接受 Image 对象,则只需对 getWidth() 和 getHeight() 方法进行一些更改即可让它发挥作用。
There is a way, but you'll have to make use of some BufferedImage transformations. Once you create them, cache them or save them off to be easily reused later. Essentially, you want to start off with a black image (source color #000000) that only uses the alpha layer to turn off pixels (also providing smooth anti-aliasing). For example, in your source image, every pixel is black, but the alpha channel differs from pixel to pixel.
First, read this article for some background information: http://www.javalobby.org/articles/ultimate-image/
Once you get done with that primer, you need to load your image into a BufferedImage:
Next you need to create a new BufferedImage to make the transform into:
Essentially, the setXORMode will XOR the color you provide with the color in the source image. If the source image is black, then whatever color you provide will be written as you specify it. With the new color using "0" for the alpha channel, the original alpha channel values will be respected. The end result is the composite you are looking for.
Edit:
You can load the initial BufferedImage in one of two ways. The easiest is to use Java's newer ImageIO API: http://download.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html to load the file directly to a BufferedImage. The call would look something like this:
Alternatively, you can create a method to read the image using the ToolKit.
Of course, if you pay attention, we have to do the exact same thing to read the image into a buffered image as we do to tint it. In short, if you changed the signature of the
colorImage
method to accept theImage
object you only need to make a couple changes to the getWidth() and getHeight() methods to get it to work.计算每个颜色分量的平均值并保留原始 Alpha:
这最适合我的情况。
To calculate average for each color component and keep original alpha:
This works best for my case.
最简单的方法是使用 JH Labs 的图像过滤器。您可以通过调用简单地调整 HSB,
The easiest way to do this would be by using the Image Filters by JH Labs. You can simply adjust HSB by calling,
这并不完全是着色,它更像是在上面应用另一层,但它对我有用:
This isn't exactly tinting, its more like applying another layer on it but it works for me:
我尝试了此页面上的所有解决方案,但没有运气。 Xor 一个(接受的答案)对我不起作用 - 染上了一种奇怪的黄色,而不是我作为参数给出的颜色,无论参数是什么。我终于找到了一种适合我的方法,尽管有点混乱。我想我会添加它,以防其他人遇到与我使用其他解决方案相同的问题。干杯!
I tried every solution on this page, had no luck. The Xor one (accepted answer) didn't work for me - tinted a weird yellow color instead of the color I was giving as an argument no matter what the argument. I finally found an approach that works for me, though it is a bit messy. Figured I'd add it in case anyone else is having the same issues I am with the other solutions. Cheers!
因为无论出于何种原因,我发现的所有方法都不适合我,这里有一个简单的方法来解决这个问题(不需要额外的库):
黑色图像将始终保持黑色,但白色图像将是您指定的颜色。该方法遍历每个像素并将图像的红绿和蓝色值与参数相乘。这正是 OpenGL glColor3f() 方法的行为。 R、G 和 B 参数必须为 0.0F 至 1.0F。
此方法对于 alpha 值没有问题。
Because all methods I found didn't work for me for whatever reason, here is an easy way to approach this (no extra libs needed):
A black image will always stay black, but a white image will be the color you specify. This method goes through every pixel and multiply the red green and blue values of the image with parameters. This is the exact behavior of the OpenGL glColor3f() method. R, G and B params must be 0.0F to 1.0F.
This method has no problem with alpha values.