空间热度图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数据,客户端按自己需求对色彩进行调整和展示即可。