空间热度图base64转RGB
操作背景
空间热度图查询,SDC返回如下内容:
- 热度图的宽、高。
- 一个二进制文件路径:二进制文件内容为宽*高个值(0~255),对应热度图每个位置的热度值,值越大热度值越高。

为了方便客户端根据得到的热度值自定义处理和呈现(例如呈现彩色图、灰度图等),当前对外(web、HW SDK)提供热度图热度值非具体图片。
数据转换伪代码:
1)定义常量
// 区分热度值
int[] BOUNDARY = {12, 24, 35, 47, 58, 70, 82, 93, 105, 116, 128, 140,
151, 163, 174, 186, 198, 209, 221, 232, 244, 256};
// AGRB计算数组
int[][] ARGB = {{0, 0, 0, 0}, {255, 0, 0, 255}, {255, 0, 51, 255}, {255, 0, 102, 255},
{255, 0, 153, 255}, {255, 0, 204, 255}, {255, 0, 255, 255}, {255, 0, 255, 204},
{255, 0, 255, 153}, {255, 0, 255, 102}, {255, 0, 255, 51}, {255, 0, 255, 0},
{255, 51, 255, 0}, {255, 102, 255, 0}, {255, 153, 255, 0}, {255, 204, 255, 0},
{255, 255, 255, 0}, {255, 255, 204, 0}, {255, 255, 153, 0}, {255, 255, 102, 0},
{255, 255, 51, 0}, {255, 255, 0, 0}};
// 透明度固定值
int MAX = 0x55000000;
LOW = 0xFF;
// 计算RGB的乘数常量
int SQUARE = 256; 2)将Base64字符串转换为RGB值int数组
int[] getRGBArray(String base64) {
// 将base64转换为字节数组
byte[] array = decoder.decode(base64);
// 用于保存RGB的数组
int[] values = new int[array.length];
for (int i = 0; i < array.length; i++) {
values[i] = getRGBValue(array[i]);
}
return values;
} 3)计算RGB值
int getRGBValue(byte input) {
// 将值限定在0-255之间
int value = input & LOW;
int rgbValue = 0;
for (int i = 0; i < BOUNDARY.length; i++) {
if (value < BOUNDARY[i]) {
// 如果为0,直接返回
if (i == 0) {
return 0;
}
// 计算RGB值,公式为,R * 256 * 256 + G * 256 + B + MAX
rgbValue = ARGB[i][1] * SQUARE * SQUARE + ARGB[i][2] * SQUARE + ARGB[i][3] + MAX;
跳出循环;
}
}
return rgbValue;
} 操作解析
将得到的热度值0~255平均划分成22等分(范围),每个范围对应一种ARGB颜色,得到彩色热度图片。
热度值和颜色对应关系如下:
热度值 | ARGB颜色 |
|---|---|
0~11 | (0, 0, 0, 0) |
12~23 | (255, 0, 0, 255) |
24~34 | (255, 0, 51, 255) |
35~46 | (255, 0, 102, 255) |
47~57 | (255, 0, 153, 255) |
58~69 | (255, 0, 204, 255) |
70~81 | (255, 0, 255, 255) |
82~92 | (255, 0, 255, 204) |
93~104 | (255, 0, 255, 153) |
105~115 | (255, 0, 255, 102) |
116~127 | (255, 0, 255, 51) |
128~139 | (255, 0, 255, 0) |
140~150 | (255, 51, 255, 0) |
151~162 | (255, 102, 255, 0) |
163~173 | (255, 153, 255, 0) |
174~185 | (255, 204, 255, 0) |
186~197 | (255, 255, 255, 0) |
198~208 | (255, 255, 204, 0) |
209~220 | (255, 255, 153, 0) |
221~231 | (255, 255, 102, 0) |
232~243 | (255, 255, 51, 0) |
244~255 | (255, 255, 0, 0) |
伪代码
先将热度图base64数据转换成byte数组,然后对byte数组里的每个值进行RGB值的转换,以下伪代码算法来自设备侧提供的实现思路:
Int getRGBVal(int b) {// b为byte数组中的值
int max = 0x55000000;
b = b&0xFF;
if(b>=0 && b <= 11)
return 0;
if(b>=12 && b <= 23)
// 这里的RGB值就是前面表格中ARGB值的后面三个,按照范围一一对应即可
return R*256*256 + G*256 + B + max;
……
} 经过以上算法即可得到RGB数据,客户端按自己需求对色彩进行调整和展示即可。

