
# 空间热度图base64转RGB
#### 操作背景
空间热度图查询，SDC返回如下内容：
- 热度图的宽、高。
- 一个二进制文件路径：二进制文件内容为宽\*高个值（0\~255），对应热度图每个位置的热度值，值越大热度值越高。
![](https://support.huaweicloud.com/api-ivm/public_sys-resources/note_3.0-zh-cn.png)
为了方便客户端根据得到的热度值自定义处理和呈现（例如呈现彩色图、灰度图等），当前对外（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数据，客户端按自己需求对色彩进行调整和展示即可。
