java - 在 Java 中将 32 位 float 分配给 4 个整数(RGBA)

标签 java image image-processing

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.0fRGBA==[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. 编辑:添加示例热图

Example heat map

已解决:因此,与软件开发中的许多其他问题一样,这个问题也有多个答案。在我的例子中,我想要最直接的路线和最少的额外工作。因此,我决定采用@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/

相关文章:

python - 属性错误: 'int' object has no attribute 'view' (1)

matlab - 如何在 MATLAB 中去除图像的彩色背景

java - 无法正确显示足够的 JLabels/TextFields

javascript - Firebase Storage 下载到电脑

python - 将全局特征添加到 SIFT 特征以查找图像相似性

image - 视频流中扑克牌的 OCR

java - 在图像上附加文本

java - 从 ListView 中删除项目

java - 托管相机服务的进程意外终止

java - 定期刷新 JList 中的项目 (Java SWING)