// Author: NiuJiuRu // Email: niujiuru@qq.com package mvs_u_takephoto /* #include "takephoto.h" */ import "C" import ( "fmt" "unsafe" ) // 图像类型 const ( IMG_TYPE_BMP = 1 // 拍照输出"bmp"图像 IMG_TYPE_JPG = 2 // 拍照输出"jpg"图像 ) // 图像水印 type SImgMark struct { CamModelName string // 相机型号名 CamSerialNum string // 相机序列号 ImgExposureTime float32 // 曝光时间值 } // 获取系统当前USBFS内存大小(MB), 成功返回: >=0, 失败返回: -1值 func getSysUsbfsMemCurrentSize() int { ret := int(C.GetSysUsbfsMemCurrentSize()) return ret } // 设置系统新的USBFS内存大小(MB), 成功返回: 0值, 失败返回: -1值 func setSysUsbfsMemSize(val int) int { setNewV := C.int(val) ret := int(C.SetSysUsbfsMemSize(setNewV)) return ret } // 单次执行相机拍照, 并保存到文件, 成功返回: 本次拍照图像的水印信息, 失败返回: 错误原因和空的水印信息 // 参数说明: // "imgType" - 图像保存类型: 1-".bmp", 2-".jpg" // "saveImgFilename" - 保存的文件名: 根据所选保存图像的类型, 程序会自动校检和处理文件的扩展名(智能) // "timeout" - 等待超时时间, 单位:秒: < 0 表示无超时; 无论超时怎么设置, 首次尝试拍照一定会 // 执行, 但时间不确定; 拍照成功、超时(相机持续无数据的时间)或发生错误时会自动结束任务. func TakePhoto(imgType int, saveImgFilename string, timeout int) (SImgMark, error) { if (imgType != IMG_TYPE_BMP && imgType != IMG_TYPE_JPG) || len(saveImgFilename) == 0 { return SImgMark{}, fmt.Errorf("invalid arguments") } filename := C.CString(saveImgFilename) defer C.free(unsafe.Pointer(filename)) var imgMark C.SImgMark ret := int(C.TakePhoto(C.EImgType(imgType), filename, C.int(timeout), &imgMark)) if ret != 0 { return SImgMark{}, fmt.Errorf("an error occurred while calling the C.TakePhoto() function(%d)", ret) } return SImgMark{ CamModelName: C.GoString((*C.char)(unsafe.Pointer(&imgMark.camModelName[0]))), CamSerialNum: C.GoString((*C.char)(unsafe.Pointer(&imgMark.camSerialNum[0]))), ImgExposureTime: float32(imgMark.imgExposureTime), }, nil }