文档首页> 行业视频管理服务 IVM> API参考> 附录> 空间热度图base64转RGB
更新时间:2024-05-21 GMT+08:00
分享

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

分享:

    相关文档

    相关产品