package com.netsdk.demo.customize.heatmap;
|
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Dimension;
|
import java.awt.FlowLayout;
|
import java.awt.Graphics;
|
import java.awt.Graphics2D;
|
import java.awt.GridLayout;
|
import java.awt.Image;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowEvent;
|
import java.awt.image.BufferedImage;
|
import java.io.ByteArrayInputStream;
|
import java.io.File;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
import java.util.Vector;
|
|
import javax.imageio.ImageIO;
|
import javax.swing.BorderFactory;
|
import javax.swing.JButton;
|
import javax.swing.JComboBox;
|
import javax.swing.JComponent;
|
import javax.swing.JFrame;
|
import javax.swing.JLabel;
|
import javax.swing.JOptionPane;
|
import javax.swing.JPanel;
|
import javax.swing.JPasswordField;
|
import javax.swing.JTextField;
|
import javax.swing.SwingUtilities;
|
import javax.swing.border.Border;
|
|
import com.netsdk.demo.util.DateChooserJButton;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.NetSDKLib.*;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.callback.impl.DefaultVideoStatHeatMapCallBack;
|
import com.netsdk.lib.enumeration.ENUMERROR;
|
import com.netsdk.lib.structure.NET_IN_GET_HEATMAPS_INFO;
|
import com.netsdk.lib.structure.NET_OUT_GET_HEATMAPS_INFO;
|
import com.netsdk.module.HeatMapModule;
|
import com.sun.jna.Memory;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
|
/**
|
* 热度图demo
|
*/
|
class HeatMapFrame extends JFrame {
|
private static final long serialVersionUID = 1L;
|
|
static NetSDKLib NetSdk = NetSDKLib.NETSDK_INSTANCE;
|
static NetSDKLib ConfigSdk = NetSDKLib.CONFIG_INSTANCE;
|
|
//登陆参数
|
// private String m_strIp2 = "172.31.17.12";
|
// private String m_strIp = "10.34.3.35";
|
// private Integer m_nPort = new Integer("37777");
|
private String m_strUser = "admin";
|
private String m_strPassword = "admin123";
|
|
// 登录参数 热成像设备
|
private String m_strIp = "172.32.102.57";
|
private Integer m_nPort = new Integer("37777");
|
|
|
//设备信息
|
private NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
|
|
private LLong m_hLoginHandle = new LLong(0); //登陆句柄
|
|
private boolean bInit = false;
|
private boolean bLogopen = false;
|
|
private DisConnect disConnect = new DisConnect(); //设备断线通知回调
|
private HaveReConnect haveReConnect = new HaveReConnect(); //网络连接恢复
|
|
// 热度图宽高
|
private int width = 0;
|
private int height = 0;
|
|
BufferedImage snapBufferedImage = null; // 抓图缓存
|
|
// 通道
|
private Vector<String> chnlist = new Vector<String>();
|
|
//设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
|
public class DisConnect implements NetSDKLib.fDisConnect {
|
public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
//网络连接恢复,设备重连成功回调
|
// 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
|
public class HaveReConnect implements NetSDKLib.fHaveReConnect {
|
public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
//初始化
|
public boolean init() {
|
|
bInit = NetSdk.CLIENT_Init(disConnect, null);
|
if (!bInit) {
|
System.out.println("Initialize SDK failed");
|
return false;
|
}
|
|
//打开日志,可选
|
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
|
File path = new File(".");
|
String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log";
|
|
setLog.bSetFilePath = 1;
|
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
|
|
setLog.bSetPrintStrategy = 1;
|
setLog.nPrintStrategy = 0;
|
bLogopen = NetSdk.CLIENT_LogOpen(setLog);
|
if (!bLogopen) {
|
System.err.println("Failed to open NetSDK log");
|
}
|
|
// 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作
|
// 此操作为可选操作,但建议用户进行设置
|
NetSdk.CLIENT_SetAutoReconnect(haveReConnect, null);
|
|
//设置登录超时时间和尝试次数,可选
|
int waitTime = 5000; //登录请求响应超时时间设置为5S
|
int tryTimes = 3; //登录时尝试建立链接3次
|
NetSdk.CLIENT_SetConnectTime(waitTime, tryTimes);
|
|
// 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime
|
// 接口设置的登录设备超时时间和尝试次数意义相同,可选
|
NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
|
netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间
|
NetSdk.CLIENT_SetNetworkParam(netParam);
|
|
//设置抓图回调函数, 图片主要在m_SnapReceiveCB中返回
|
NetSdk.CLIENT_SetSnapRevCallBack(m_SnapReceiveCB, null);
|
|
return true;
|
}
|
|
//清除环境
|
public void cleanup() {
|
if (bLogopen) {
|
NetSdk.CLIENT_LogClose();
|
}
|
|
if (bInit) {
|
NetSdk.CLIENT_Cleanup();
|
}
|
}
|
|
public HeatMapFrame() {
|
init();
|
setTitle("获取热度图");
|
setSize(700, 670);
|
setLayout(new BorderLayout());
|
setLocationRelativeTo(null);
|
|
loginPanel = new LoginPanel();
|
heatMapPanel = new HeatMapPanel();
|
|
add(loginPanel, BorderLayout.NORTH);
|
add(heatMapPanel, BorderLayout.CENTER);
|
|
addWindowListener(new WindowAdapter() {
|
public void windowClosing(WindowEvent e) {
|
dispose();
|
SwingUtilities.invokeLater(new Runnable() {
|
public void run() {
|
logout();
|
cleanup();
|
System.exit(0);
|
}
|
});
|
}
|
});
|
}
|
|
//设置边框
|
private void setBorderEx(JComponent object, String title, int width) {
|
Border innerBorder = BorderFactory.createTitledBorder(title);
|
Border outerBorder = BorderFactory.createEmptyBorder(width, width, width, width);
|
object.setBorder(BorderFactory.createCompoundBorder(outerBorder, innerBorder));
|
}
|
|
//登录面板
|
private class LoginPanel extends JPanel {
|
private static final long serialVersionUID = 1L;
|
|
public LoginPanel() {
|
setLayout(new FlowLayout());
|
setBorderEx(this, "登录", 2);
|
Dimension dimension = new Dimension();
|
dimension.height = 60;
|
setPreferredSize(dimension);
|
|
loginBtn = new JButton("登录");
|
logoutBtn = new JButton("登出");
|
nameLabel = new JLabel("用户名");
|
passwordLabel = new JLabel("密码");
|
nameTextArea = new JTextField(m_strUser, 8);
|
passwordTextArea = new JPasswordField(m_strPassword, 8);
|
ipLabel = new JLabel("设备地址");
|
portLabel = new JLabel("端口号");
|
ipTextArea = new JTextField(m_strIp, 8);
|
portTextArea = new JTextField(m_nPort.toString(), 5);
|
|
add(ipLabel);
|
add(ipTextArea);
|
add(portLabel);
|
add(portTextArea);
|
add(nameLabel);
|
add(nameTextArea);
|
add(passwordLabel);
|
add(passwordTextArea);
|
add(loginBtn);
|
add(logoutBtn);
|
|
logoutBtn.setEnabled(false);
|
|
//登录按钮,监听事件
|
loginBtn.addActionListener(new ActionListener() {
|
public void actionPerformed(ActionEvent e) {
|
login();
|
}
|
});
|
|
//登出按钮,监听事件
|
logoutBtn.addActionListener(new ActionListener() {
|
public void actionPerformed(ActionEvent e) {
|
logout();
|
}
|
});
|
}
|
}
|
|
// 热度图获取
|
private class HeatMapPanel extends JPanel {
|
private static final long serialVersionUID = 1L;
|
|
public HeatMapPanel() {
|
setLayout(new BorderLayout());
|
setBorderEx(this, "热度图获取", 2);
|
|
JPanel panel1 = new JPanel();
|
showHeatMapPanel = new PaintPanel();
|
|
add(panel1, BorderLayout.NORTH);
|
add(showHeatMapPanel, BorderLayout.CENTER);
|
|
//////////////////////////
|
startTimeLabel = new JLabel("开始时间:");
|
endTimeLabel = new JLabel("结束时间:");
|
startTimeBtn = new DateChooserJButton("2018-5-23 00:00:00");
|
endTimeBtn = new DateChooserJButton();
|
snapPicBtn = new JButton("获取热度图");
|
chnLabel = new JLabel("通道号:");
|
chnComoBox = new JComboBox(chnlist);
|
planIdLabel = new JLabel("计划ID:");
|
String[] planIdStr = {"1", "2", "3", "4"};
|
planIdComoBox = new JComboBox(planIdStr);
|
resultLabel = new JLabel("获取热度图状态 :", JLabel.CENTER);
|
|
chnComoBox.setPreferredSize(new Dimension(80, 23));
|
planIdComoBox.setPreferredSize(new Dimension(80, 23));
|
resultLabel.setPreferredSize(new Dimension(200, 23));
|
|
Dimension dimension = new Dimension();
|
dimension.height = 90;
|
panel1.setPreferredSize(dimension);
|
|
panel1.setLayout(new GridLayout(3, 1));
|
|
JPanel panel2 = new JPanel();
|
JPanel panel3 = new JPanel();
|
|
panel1.add(panel2);
|
panel1.add(panel3);
|
panel1.add(resultLabel);
|
|
//
|
panel2.setLayout(new FlowLayout());
|
panel3.setLayout(new FlowLayout());
|
|
panel2.add(startTimeLabel);
|
panel2.add(startTimeBtn);
|
panel2.add(endTimeLabel);
|
panel2.add(endTimeBtn);
|
|
panel3.add(chnLabel);
|
panel3.add(chnComoBox);
|
panel3.add(planIdLabel);
|
panel3.add(planIdComoBox);
|
panel3.add(snapPicBtn);
|
|
startTimeBtn.setEnabled(false);
|
endTimeBtn.setEnabled(false);
|
snapPicBtn.setEnabled(false);
|
chnComoBox.setEnabled(false);
|
planIdComoBox.setEnabled(false);
|
|
snapPicBtn.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
showHeatMapPanel.setOpaque(true);
|
showHeatMapPanel.repaint();
|
snapBufferedImage = null;
|
BufferedImage heatBufferedImage = null;
|
resultLabel.setText("获取热度图状态 :");
|
|
///////////////// 抓图,并保存图片 ///////////////
|
resultLabel.setText("获取热度图状态 :正在抓图.");
|
snapPicture(chnComoBox.getSelectedIndex());
|
|
//////////////// 查询热度图,并保存图片 ////////////////////
|
resultLabel.setText("获取热度图状态 :正在查询热度图信息.");
|
byte[] buffer = queryHeatMap(chnComoBox.getSelectedIndex(), planIdComoBox.getSelectedIndex() + 1, startTimeBtn.getText(), endTimeBtn.getText());
|
|
if (buffer == null) {
|
return;
|
}
|
|
resultLabel.setText("获取热度图状态 :正在生成热度图.");
|
|
// 将buffer 归一化,线性拉伸
|
EnlargeGrayRange(buffer, 0, 255);
|
|
// 伪彩色
|
heatBufferedImage = PGrayToPseudoColor(buffer, width, height);
|
|
// 热度图路径
|
File currentPath = new File(".");
|
String strFileHeatPic = currentPath.getAbsoluteFile().getParent() + "\\" + "HeatPicture.jpg";
|
|
if (heatBufferedImage == null) {
|
JOptionPane.showMessageDialog(null, "没查到热度图");
|
return;
|
}
|
|
try {
|
// 热度图
|
ImageIO.write(heatBufferedImage, "jpg", new File(strFileHeatPic));
|
} catch (IOException e1) {
|
e1.printStackTrace();
|
}
|
|
//////////////// 以抓图为背景,将热度图叠加上去。合成图片 /////////////////////
|
while (true) {
|
if (snapBufferedImage != null) {
|
break;
|
}
|
|
try {
|
Thread.sleep(5000);
|
break;
|
} catch (InterruptedException e1) {
|
e1.printStackTrace();
|
}
|
}
|
|
resultLabel.setText("获取热度图状态 :正在合成热度图.");
|
|
// 合成图路径
|
String strFileComposePic = currentPath.getAbsoluteFile().getParent() + "\\" + "ComposePicture.jpg";
|
|
Graphics2D graphics2d = snapBufferedImage.createGraphics();
|
graphics2d.drawImage(heatBufferedImage, 0, 0, snapBufferedImage.getWidth(), snapBufferedImage.getHeight(), null);
|
|
try {
|
ImageIO.write(snapBufferedImage, "jpg", new File(strFileComposePic));
|
} catch (IOException e1) {
|
e1.printStackTrace();
|
}
|
|
resultLabel.setText("获取热度图状态 :已合成热度图.");
|
|
if (snapBufferedImage != null) {
|
showHeatMapPanel.setOpaque(false);
|
showHeatMapPanel.setImage(snapBufferedImage);
|
showHeatMapPanel.repaint();
|
}
|
}
|
}).start();
|
}
|
});
|
}
|
}
|
|
////////////////////////////////////// 接口实现 ///////////////////////////////////////////////
|
|
|
//登录按钮事件
|
private void login() {
|
m_strIp = ipTextArea.getText();
|
m_nPort = Integer.parseInt(portTextArea.getText());
|
m_strUser = nameTextArea.getText();
|
m_strPassword = new String(passwordTextArea.getPassword());
|
|
System.out.println("设备地址:" + m_strIp + "\n端口号:" + m_nPort
|
+ "\n用户名:" + m_strUser + "\n密码:" + m_strPassword);
|
|
IntByReference nError = new IntByReference(0);
|
System.out.println("设备信息:" + m_stDeviceInfo);
|
loginForHeatMapDirectly();
|
m_hLoginHandle = NetSdk.CLIENT_LoginEx2(m_strIp, m_nPort.intValue(), m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
|
if (m_hLoginHandle.longValue() == 0) {
|
System.err.println("Login Device[%s] Port[%d]Failed." + ToolKits.getErrorCode());
|
} else {
|
System.out.println("Login Success [ " + m_strIp + " ]");
|
logoutBtn.setEnabled(true);
|
loginBtn.setEnabled(false);
|
startTimeBtn.setEnabled(true);
|
endTimeBtn.setEnabled(true);
|
snapPicBtn.setEnabled(true);
|
chnComoBox.setEnabled(true);
|
planIdComoBox.setEnabled(true);
|
|
for (int i = 0; i < m_stDeviceInfo.byChanNum; i++) {
|
chnlist.add("通道号 " + i);
|
}
|
|
if (m_stDeviceInfo.byChanNum > 0) {
|
chnComoBox.setSelectedIndex(0);
|
}
|
}
|
}
|
|
|
//登出按钮事件
|
private void logout() {
|
if (m_hLoginHandle.longValue() != 0) {
|
System.out.println("Logout Button Action");
|
|
|
if (NetSdk.CLIENT_Logout(m_hLoginHandle)) {
|
System.out.println("Logout Success [ " + m_strIp + " ]");
|
m_hLoginHandle.setValue(0);
|
logoutBtn.setEnabled(false);
|
loginBtn.setEnabled(true);
|
startTimeBtn.setEnabled(false);
|
endTimeBtn.setEnabled(false);
|
snapPicBtn.setEnabled(false);
|
chnComoBox.setEnabled(false);
|
planIdComoBox.setEnabled(false);
|
showHeatMapPanel.setOpaque(true);
|
showHeatMapPanel.repaint();
|
chnlist.clear();
|
resultLabel.setText("获取热度图状态 :");
|
}
|
}
|
}
|
|
// 远程抓图
|
public void snapPicture(int chn) {
|
// 发送抓图命令给前端设备,抓图的信息
|
NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS();
|
stuSnapParams.Channel = chn; //抓图通道
|
stuSnapParams.mode = 0; //表示请求一帧
|
stuSnapParams.Quality = 3;
|
stuSnapParams.InterSnap = 5;
|
stuSnapParams.CmdSerial = 100; // 请求序列号,有效值范围 0~65535,超过范围会被截断为
|
|
IntByReference reserved = new IntByReference(0);
|
|
if (false == NetSdk.CLIENT_SnapPictureEx(m_hLoginHandle, stuSnapParams, reserved)) {
|
System.err.println("CLIENT_SnapPictureEx Failed!" + ToolKits.getErrorCode());
|
return;
|
} else {
|
System.out.println("CLIENT_SnapPictureEx success");
|
}
|
}
|
|
|
private fSnapReceiveCB m_SnapReceiveCB = new fSnapReceiveCB();
|
|
public class fSnapReceiveCB implements NetSDKLib.fSnapRev {
|
public void invoke(LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
|
//pBuf收到的图片数据
|
File currentPath = new File(".");
|
String strFileSnapPic = currentPath.getAbsoluteFile().getParent() + "\\" + "SnapPicture.jpg";
|
|
byte[] buf = pBuf.getByteArray(0, RevLen);
|
|
ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf);
|
try {
|
snapBufferedImage = ImageIO.read(byteArrInput);
|
|
if (snapBufferedImage == null) {
|
return;
|
}
|
ImageIO.write(snapBufferedImage, "jpg", new File(strFileSnapPic));
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
// 查询热度图
|
public byte[] queryHeatMap(int chn, int planId, String startTime, String endTime) {
|
byte[] buffer = null;
|
|
// 开始时间
|
String[] startStr = startTime.split(" ");
|
String[] startTimeStr1 = startStr[0].split("-");
|
String[] startTimeStr2 = startStr[1].split(":");
|
|
// 结束时间
|
String[] endStr = endTime.split(" ");
|
String[] endTimeStr1 = endStr[0].split("-");
|
String[] endTimeStr2 = endStr[1].split(":");
|
|
|
NET_QUERY_HEAT_MAP heatMap = new NET_QUERY_HEAT_MAP();
|
heatMap.stuIn.nChannel = chn; // 通道
|
|
heatMap.stuIn.nPlanID = planId; // 计划ID
|
|
// 开始时间
|
heatMap.stuIn.stuBegin.dwYear = Integer.parseInt(startTimeStr1[0]);
|
heatMap.stuIn.stuBegin.dwMonth = Integer.parseInt(startTimeStr1[1]);
|
heatMap.stuIn.stuBegin.dwDay = Integer.parseInt(startTimeStr1[2]);
|
heatMap.stuIn.stuBegin.dwHour = Integer.parseInt(startTimeStr2[0]);
|
heatMap.stuIn.stuBegin.dwMinute = Integer.parseInt(startTimeStr2[1]);
|
heatMap.stuIn.stuBegin.dwSecond = Integer.parseInt(startTimeStr2[2]);
|
|
// 结束时间
|
heatMap.stuIn.stuEnd.dwYear = Integer.parseInt(endTimeStr1[0]);
|
heatMap.stuIn.stuEnd.dwMonth = Integer.parseInt(endTimeStr1[1]);
|
heatMap.stuIn.stuEnd.dwDay = Integer.parseInt(endTimeStr1[2]);
|
heatMap.stuIn.stuEnd.dwHour = Integer.parseInt(endTimeStr2[0]);
|
heatMap.stuIn.stuEnd.dwMinute = Integer.parseInt(endTimeStr2[1]);
|
heatMap.stuIn.stuEnd.dwSecond = Integer.parseInt(endTimeStr2[2]);
|
|
// 指针申请内存
|
int size = 4000 * 4000;
|
heatMap.stuOut.pBufData = new Memory(size);
|
heatMap.stuOut.pBufData.clear(size);
|
|
heatMap.stuOut.nBufLen = size;
|
|
heatMap.stuOut.emDataType = 1; // 1-灰度数据 2-原始数据
|
|
IntByReference pRetLen = new IntByReference(0);
|
|
heatMap.write();
|
boolean bRet = NetSdk.CLIENT_QueryDevState(m_hLoginHandle, NetSDKLib.NET_DEVSTATE_GET_HEAT_MAP,
|
heatMap.getPointer(), heatMap.size(), pRetLen, 5000);
|
heatMap.read();
|
if (bRet) {
|
width = heatMap.stuOut.nWidth;
|
height = heatMap.stuOut.nHeight;
|
|
buffer = heatMap.stuOut.pBufData.getByteArray(0, heatMap.stuOut.nBufRet);
|
} else {
|
JOptionPane.showMessageDialog(null, "查到热度图失败, 错误码 :" + ToolKits.getErrorCode());
|
System.err.println("Query HeatMap Failed!" + ToolKits.getErrorCode());
|
}
|
return buffer;
|
}
|
|
|
// 伪彩色处理
|
public BufferedImage PGrayToPseudoColor(byte[] data, int width, int height) {
|
int nLimitColor = 5;
|
|
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
|
int R, G, B;
|
byte[] buffer = new byte[4]; // 一个像素点
|
int temp = 0;
|
|
for (int y = 0; y < height; y++) {
|
for (int x = 0; x < width; x++) {
|
|
R = buffer[0];
|
G = buffer[1];
|
B = buffer[2];
|
|
buffer[3] = (byte) 0.7 * 255;// 不透明度
|
|
temp = 0xff & data[x + y * width];
|
|
if (temp < nLimitColor) {
|
buffer[3] = 0; // 太小的直接透明,不覆盖
|
|
bufferedImage.setRGB(x, y, 0);
|
continue;
|
} else if (temp >= nLimitColor && temp <= 51) {
|
buffer[0] = 0;
|
buffer[1] = (byte) (5 * temp);
|
buffer[2] = (byte) 255;
|
} else if (temp > 51 && temp <= 102) {
|
int k = temp - 51;
|
buffer[0] = 0;
|
buffer[1] = (byte) 255;
|
buffer[2] = (byte) (255 - 5 * k);
|
} else if (temp > 102 && temp <= 153) {
|
int k = temp - 102;
|
buffer[0] = (byte) (k * 5);
|
buffer[1] = (byte) 255;
|
buffer[2] = 0;
|
} else if (temp > 153 && temp <= 204) {
|
int k = temp - 153;
|
buffer[0] = (byte) 255;
|
buffer[1] = (byte) (255 - (128.0 * k / 51 + 0.5));
|
buffer[2] = 0;
|
} else if (temp > 204) {
|
int k = temp - 204;
|
buffer[0] = (byte) 255;
|
buffer[1] = (byte) (127 - (127.0 * k / 51 + 0.5));
|
buffer[2] = 0;
|
}
|
|
bufferedImage.setRGB(x, y, (170 << 24) | (new Color((0xff & buffer[0]), (0xff & buffer[1]), (0xff & buffer[2])).getRGB() & 0x00ffffff));
|
}
|
}
|
|
return bufferedImage;
|
}
|
|
|
// 线性拉伸
|
public byte[] EnlargeGrayRange(byte[] data, int min, int max) {
|
if (data == null) {
|
return null;
|
}
|
|
byte srcMax = getByteArrMax(data);
|
byte srcMin = getByteArrMin(data);
|
|
double k = (max - min) * 1.0 / ((srcMax & 0xff) - (srcMin & 0xff));
|
|
byte[] buffer = new byte[(srcMax & 0xff) - (srcMin & 0xff) + 1];
|
|
for (int i = (srcMin & 0xff); i < buffer.length; i++) {
|
buffer[i] = (byte) ((i - (srcMin & 0xff)) * k + min);
|
}
|
|
for (int i = 0; i < data.length; i++) {
|
data[i] = buffer[data[i] & 0xff];
|
}
|
|
return data;
|
}
|
|
// 获取byte[] 最大值
|
public byte getByteArrMax(byte[] buffer) {
|
if (buffer == null) {
|
return 0;
|
}
|
|
byte max = 0;
|
|
for (int i = 0; i < buffer.length; i++) {
|
// 取出最大值
|
if ((max & 0xff) < (buffer[i] & 0xff)) {
|
max = buffer[i];
|
}
|
}
|
return max;
|
}
|
|
// 获取byte[] 最小值
|
public byte getByteArrMin(byte[] buffer) {
|
if (buffer == null) {
|
return 0;
|
}
|
|
byte min = 0;
|
|
for (int i = 0; i < buffer.length; i++) {
|
// 取出最大值
|
if ((min & 0xff) > (buffer[i] & 0xff)) {
|
min = buffer[i];
|
}
|
}
|
return min;
|
}
|
|
public static void savePicture(byte[] pBuf, String sDstFile) {
|
try {
|
FileOutputStream fos = new FileOutputStream(sDstFile);
|
fos.write(pBuf);
|
fos.close();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
public int[] GetPointerDataToIntArray(Pointer pointer, int length) {
|
int[] buffer = null;
|
if (pointer == null) {
|
return null;
|
}
|
|
if (length > 0) {
|
buffer = new int[length];
|
pointer.read(0, buffer, 0, length);
|
}
|
|
return buffer;
|
}
|
|
//带背景的面板组件
|
private class PaintPanel extends JPanel {
|
private static final long serialVersionUID = 1L;
|
private Image image; //背景图片
|
|
public PaintPanel() {
|
super();
|
setOpaque(true); //非透明
|
setLayout(null);
|
setBackground(new Color(153, 240, 255));
|
setForeground(new Color(0, 0, 0));
|
}
|
|
//设置图片的方法
|
public void setImage(Image image) {
|
this.image = image;
|
}
|
|
protected void paintComponent(Graphics g) { //重写绘制组件外观
|
if (image != null) {
|
g.drawImage(image, 0, 0, getWidth(), getHeight(), this);//绘制图片与组件大小相同
|
}
|
super.paintComponent(g); // 执行超类方法
|
}
|
}
|
|
/*
|
* 登录
|
*/
|
private LoginPanel loginPanel;
|
private JButton loginBtn;
|
private JButton logoutBtn;
|
|
private JLabel nameLabel;
|
private JLabel passwordLabel;
|
private JLabel ipLabel;
|
private JLabel portLabel;
|
private JTextField ipTextArea;
|
private JTextField portTextArea;
|
private JTextField nameTextArea;
|
private JPasswordField passwordTextArea;
|
|
private HeatMapPanel heatMapPanel;
|
private DateChooserJButton startTimeBtn;
|
private DateChooserJButton endTimeBtn;
|
private JLabel startTimeLabel;
|
private JLabel endTimeLabel;
|
private JButton snapPicBtn;
|
private JLabel chnLabel;
|
private JComboBox chnComoBox;
|
private JLabel planIdLabel;
|
private JComboBox planIdComoBox;
|
private JLabel resultLabel;
|
private PaintPanel showHeatMapPanel;
|
|
|
String ip = m_strIp;
|
int port = m_nPort;
|
String username = m_strUser;
|
String password = m_strPassword;
|
|
// 热成像设备登录
|
NetSDKLib.LLong lLong = new LLong(0);
|
|
public void loginForHeatMapDirectly() {
|
IntByReference nError = new IntByReference(0);
|
System.out.println("Login ip: " + ip + " port: " + port + " username: " + username + " password: " + password + "\n" + " deviceInfo" + m_stDeviceInfo);
|
lLong = NetSdk.CLIENT_LoginEx2(ip, port, username, password, 0, null, m_stDeviceInfo, nError);
|
if (lLong.longValue() == 0L) {
|
System.err.println("登录失败!" + ENUMERROR.getErrorMessage());
|
} else {
|
System.out.println(" username: " + username + "成功登录!" + "\n" + "通道号个数: " + m_stDeviceInfo.byChanNum);
|
for (int i = 0; i < m_stDeviceInfo.byChanNum; i++) {
|
chnlist.add("通道号 " + i);
|
}
|
if (m_stDeviceInfo.byChanNum > 0) {
|
chnComoBox.setSelectedIndex(0);
|
}
|
}
|
}
|
|
int channel = 1;
|
// TODO 参数不合法
|
public void getHeatMapDirectlyTest() {
|
// 获取热成像温度的入参
|
NET_OUT_GET_HEATMAPS_INFO outParam = new NET_OUT_GET_HEATMAPS_INFO();
|
NET_IN_GET_HEATMAPS_INFO inParam = new NET_IN_GET_HEATMAPS_INFO();
|
System.out.println("inParam Size --> " + inParam.dwSize + "\n" + "outParam size --> " + outParam.size());
|
inParam.nChannel = channel;
|
inParam.write();
|
outParam.write();
|
if (null == inParam.getPointer() || null == outParam.getPointer()){
|
System.err.println("用户参数不合法!");
|
}
|
boolean ret = NetSdk.CLIENT_GetHeatMapsDirectly(lLong, inParam.getPointer(), outParam.getPointer(), 3000);
|
if (ret) {
|
System.out.println("GetHeatMapsDirectly success");
|
outParam.read();
|
// todo
|
} else {
|
System.err.println("GetHeatMapsDirectly false!" + ENUMERROR.getErrorMessage());
|
}
|
}
|
|
|
|
|
}
|
|
|
public class HeatMap {
|
public static void main(String[] args) {
|
HeatMapFrame heatMapFrame = new HeatMapFrame();
|
heatMapFrame.loginForHeatMapDirectly();
|
heatMapFrame.getHeatMapDirectlyTest();
|
// SwingUtilities.invokeLater(new Runnable() {
|
// public void run() {
|
// HeatMapFrame demo = new HeatMapFrame();
|
// demo.setVisible(true);
|
// }
|
// });
|
}
|
}
|