1. 考虑在 (0.0f .. 1.0f) 中的一个 32 位 java float sample
和四个 32 位 java 整数 r, g, b, a
每个都在 (0 .. 255) 中的一个名为 RGBA
的 vector 中。
2. sample
变量包含我希望以热图形式在 ImageIcon
中呈现的标准化测量数据。最终 RGBA 值的目标是一个整数 vector ,稍后作为像素数据传递给 java BufferdImage
。
3. 约束条件是当 sample==0.0f
时 RGBA==[0,0,0,255]
具有均匀分布所以 sample==1.0f
表示 RGBA==[255,0,0,255]
而 sample==0.5f
表示为 RGBA==[255,255,255,255]
。 Alpha channel 始终为 255。
4. 到目前为止,我使用了一种静态方法,将颜色分为三个独立的部分 R G B,而 A 在 255 处保持静态。像这样
/* BLUE */
if ( sample <= 0.340000f ){
localSample = (sample/(0.340000f/255.000000f));
sourceLinearData[localIndex] = 0; // R
sourceLinearData[localIndex+1] = 0; // G
sourceLinearData[localIndex+2] = Math.round(localSample); // B
}
5. 我的问题:A) 是否有任何合适的 java api/库可以帮助我做到这一点? B) 如果没有,那么我会征求解决方案的建议。
6. 想法:由于每个 R、G、B、A 都在 (0 .. 255) 中,我假设我可以使用字节而不是整数,然后可能将这些字节转换为一个变量,然后以这种方式提取 float 。虽然到目前为止我还没有用这种方法取得任何成功。
7. 编辑:添加示例热图
已解决:因此,与软件开发中的许多其他问题一样,这个问题也有多个答案。在我的例子中,我想要最直接的路线和最少的额外工作。因此,我决定采用@haraldK 给出的答案。尽管如此,如果您正在寻找一种具有更多控制、精确度和灵 active 的正式解决方案,@SashaSalauyou 提供的答案是更正确的答案。
最佳答案
详细说明我上面的评论。这并没有完全给出上面 map 中的颜色,但它非常接近,而且非常简单:
float sample = ...; // [0...1]
float hue = (1 - sample) * .75f; // limit hue to [0...0.75] to avoid color "loop"
int rgb = Color.getHSBColor(hue, 1, 1).getRGB();
如果您想在刻度的“边缘”使用较暗的色调,您可以使用正弦函数来计算亮度,例如:
float hue = (1 - sample) * .75f;
float brightness = .5f + (float) Math.sin(Math.PI * sample) / 2;
int rgb = Color.getHSBColor(hue, 1, brightness).getRGB();
关于java - 在 Java 中将 32 位 float 分配给 4 个整数(RGBA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32120596/