问题描述
海康设备网络SDK二次开发时,实现抓图功能时使用了NET_DVR_CaptureJPEGPicture方法。下图为方法描述。
发现抓出来的图片文件出现乱码,或者抓图失败报34错误码(创建文件出错。本地录像、保存图片、获取配置文件和远程下载录像时创建文件失败)。
问题定位
方法调用过程
//图片结构体
HCNetSDK.NET_DVR_JPEGPARA ipJpegPara = new HCNetSDK.NET_DVR_JPEGPARA();
ipJpegPara.wPicQuality = 1;
ipJpegPara.wPicSize = 2;
LocalDateTime now = LocalDateTime.now();
// 定义 SQL DATETIME 格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 将当前时间格式化为 SQL DATETIME 字符串
String sqlDateTime = now.format(formatter);
//2024-08-07 18:11:11 ——> 20240807181111
sqlDateTime = sqlDateTime.replaceAll("[:\\s-]+","");
String text = "D:\\Java\\Java Projects\\ClientDemo\\pic\\"+ sqlDateTime +".jpeg";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
//打印字节数组
ByteBuffer buffer = ByteBuffer.wrap(bytes);
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
//System.out.println(new String(bytes, StandardCharsets.UTF_8));
Thread.sleep(500);
if (hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID,1,ipJpegPara,bytes)){
System.out.println("ok");
}else {
System.out.println("不ok"+hCNetSDK.NET_DVR_GetLastError());
}
通过打印字节数组bytes[],发现最后5位分别为46、106、112、101、103,即.jpeg,由此判断传参过程没有问题,问题出在SDK的NET_DVR_CaptureJPEGPicture方法上。
问题解决
方案一
文件后缀改为.jpg,原理我也不懂。
String text = "D:\\Java\\Java Projects\\ClientDemo\\pic\\"+ sqlDateTime +".jpg";
处理结果:成功抓图,无乱码
方案二
处理乱码文件名
String directoryPath = "D:\\Java\\Java Projects\\ClientDemo\\pic\\";
File directory = new File(directoryPath);
String finalSqlDateTime = sqlDateTime;
File[] files = directory.listFiles((dir, name) -> name.contains(finalSqlDateTime));
// 检查文件数组并重命名包含"finalSqlDateTime"的文件
if (files != null) {
for (File file : files) {
// 构建新文件名
String newName = finalSqlDateTime+".jpeg";
File newFile = new File(file.getParent(), newName);
// 重命名文件
if (file.renameTo(newFile)) {
System.out.println("Renamed file: " + file.getName() + " to " + newName);
} else {
System.out.println("Failed to rename file: " + file.getName());
}
}
}
处理结果