我正在使用 Java 类RescaleOp来更改BufferedImage实例的亮度。Alpha 通道始终会导致问题。请参阅下面的参考资料——感谢@trashgod令人印象深刻的 Java2D 见解。
来自alpha 通道实例的文档RescaleOp明确说明在单因素构造函数中没有缩放——我将其解释为or 。BufferedImagefloatfloat[1]
来自 JDK6 的引用:(添加了重点)
对于 BufferedImages,重新缩放对颜色和 alpha 分量进行操作。缩放常数组的数量可以是一组,在这种情况下,相同的常数将应用于所有颜色(但不是 alpha)分量。否则,缩放常数集的数量可能等于源颜色分量的数量,在这种情况下,不会执行 alpha 分量(如果存在)的重新缩放。如果这两种情况都不适用,则缩放常数集的数量必须等于源颜色分量加上 alpha 分量的数量,在这种情况下,所有颜色和 alpha 分量都会重新缩放。
对于BufferedImagewith 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()
- 可能有帮助的方法:
请指教。