我正在使用 Java 类RescaleOp
来更改BufferedImage
实例的亮度。Alpha 通道始终会导致问题。请参阅下面的参考资料——感谢@trashgod令人印象深刻的 Java2D 见解。
来自alpha 通道实例的文档RescaleOp
明确说明在单因素构造函数中没有缩放——我将其解释为or 。BufferedImage
float
float[1]
来自 JDK6 的引用:(添加了重点)
对于 BufferedImages,重新缩放对颜色和 alpha 分量进行操作。缩放常数组的数量可以是一组,在这种情况下,相同的常数将应用于所有颜色(但不是 alpha)分量。否则,缩放常数集的数量可能等于源颜色分量的数量,在这种情况下,不会执行 alpha 分量(如果存在)的重新缩放。如果这两种情况都不适用,则缩放常数集的数量必须等于源颜色分量加上 alpha 分量的数量,在这种情况下,所有颜色和 alpha 分量都会重新缩放。
对于BufferedImage
with type BufferedImage.TYPE_INT_ARGB
,有四个通道 (RGBA),其中 alpha 是最后一个通道。(他们为什么不叫它BufferedImage.TYPE_INT_RGBA
?)我尝试了这些RescaleOp
转换但没有成功:(假设float scaleFactor = 1.25f
和float offset = 0.0f
)
new RescaleOp(scaleFactor, offset, (RenderingHints) null)
new RescaleOp(new float[] { scaleFactor },
new float[] { offset },
(RenderingHints) null)
new RescaleOp(new float[] { scaleFactor, scaleFactor, scaleFactor },
new float[] { offset, offset, offset },
(RenderingHints) null)
只有这个有效:(假设float alphaScaleFactor = 1.0f
)
new RescaleOp(new float[] { scaleFactor, scaleFactor, scaleFactor, alphaScaleFactor },
new float[] { offset, offset, offset, offset },
(RenderingHints) null)
- 我是否误解了官方的 JDK 文档?
- 或者,这是一个可以/应该在未来的 JDK 中修复的错误?
- 有没有办法找到(在运行时)alpha 通道索引?
- 可能有帮助的方法:
ColorModel BufferedImage.getColorModel()
int ColorModel.getNumColorComponents()
boolean ColorModel.hasAlpha()
int ColorModel.getNumComponents()
(可能包括可选的 Alpha 通道)ColorSpace ColorModel.getColorSpace()
- 可能有帮助的方法:
请指教。