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