海康SDK抓图问题(NET_DVR_CaptureJPEGPicture方法)

问题描述

海康设备网络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());
          }
      }
}

处理结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用海康SDK提供的HCNetSDK.dll库文件来调用它的抓图功能。以下是一个简单的示例代码,可以帮助你开始: ```python import sys import os from ctypes import * # 加载HCNetSDK.dll dll_path = os.path.join(os.getcwd(), "HCNetSDK.dll") hcnetsdk = windll.LoadLibrary(dll_path) # 登录设备 def login_device(ip, port, username, password): device_info = hcnetsdk.NET_DVR_DEVICEINFO_V30() lUserID = hcnetsdk.NET_DVR_Login_V30(ip.encode('utf-8'), port, username.encode('utf-8'), password.encode('utf-8'), byref(device_info)) if lUserID < 0: print("登录失败,错误码:", hcnetsdk.NET_DVR_GetLastError()) return -1 else: print("登录成功,用户ID:", lUserID) return lUserID # 抓图 def capture_picture(lUserID): pic_path = "snapshot.jpg" pic_size = 1024 * 1024 pic_buffer = create_string_buffer(pic_size) ret = hcnetsdk.NET_DVR_CaptureJPEGPicture(lUserID, 1, byref(pic_buffer), pic_size, byref(c_long(0))) if ret > 0: with open(pic_path, "wb") as f: f.write(pic_buffer.raw[:ret]) print("抓图成功,图片已保存到:", pic_path) else: print("抓图失败,错误码:", hcnetsdk.NET_DVR_GetLastError()) # 退出登录 def logout_device(lUserID): hcnetsdk.NET_DVR_Logout(lUserID) if __name__ == '__main__': ip = "192.168.1.64" # 设备IP地址 port = 8000 # 设备端口号 username = "admin" # 登录用户名 password = "12345" # 登录密码 lUserID = login_device(ip, port, username, password) if lUserID < 0: sys.exit() capture_picture(lUserID) logout_device(lUserID) ``` 需要注意的是,此示例仅适用于海康SDK V5.3以上版本。在使用该示例前,你需要安装海康SDK并且根据你的Python版本安装相应的ctypes模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值