截图返回字节流 - GetScreenData
函数简介
获取指定区域的图像数据,以二进制数据的方式返回。数据格式为BBGGRRAA(BGRA格式),每个像素占用4字节。此函数比GetScreenDataBmp具有更高的读取效率,适用于需要快速获取屏幕图像数据的场景。
图像尺寸计算:
- 图像宽度 = stride / 4
- 图像高度 = size / stride
当x1, y1, x2, y2参数都传0时,将获取窗口整个客户区的图像。
接口名称
GetScreenData
DLL调用
int GetScreenData(long ola, int x1, int y1, int x2, int y2, long* data, int* size, int* stride)
参数定义:
ola
(长整型数): OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。x1
(整型数): 区域的左上X坐标y1
(整型数): 区域的左上Y坐标x2
(整型数): 区域的右下X坐标y2
(整型数): 区域的右下Y坐标data
(长整型数指针): 返回图片数据的指针地址size
(整型数指针): 返回图片数据的总长度(字节数)stride
(整型数指针): 返回图片每行数据的字节数
示例:
// 获取指定区域的图像数据
long data = 0;
int size = 0;
int stride = 0;
if (GetScreenData(ola, 0, 0, 800, 600, &data, &size, &stride)) {
// 计算图像尺寸
int width = stride / 4;
int height = size / stride;
// 处理图像数据
unsigned char* imageData = (unsigned char*)data;
// ... 处理图像数据 ...
printf("图像尺寸: %dx%d\n", width, height);
printf("数据大小: %d 字节\n", size);
printf("每行字节数: %d\n", stride);
} else {
printf("获取图像数据失败\n");
}
// 获取整个客户区
if (GetScreenData(ola, 0, 0, 0, 0, &data, &size, &stride)) {
// ... 处理图像数据 ...
}
COM调用
int GetScreenData(int x1, int y1, int x2, int y2, long* data, int* size, int* stride)
参数定义:
x1
(整型数): 区域的左上X坐标y1
(整型数): 区域的左上Y坐标x2
(整型数): 区域的右下X坐标y2
(整型数): 区域的右下Y坐标data
(长整型数指针): 返回图片数据的指针地址size
(整型数指针): 返回图片数据的总长度(字节数)stride
(整型数指针): 返回图片每行数据的字节数
示例:
# 获取指定区域的图像数据
data = 0
size = 0
stride = 0
if ola.GetScreenData(0, 0, 800, 600, data, size, stride):
# 计算图像尺寸
width = stride / 4
height = size / stride
# 处理图像数据
print(f"图像尺寸: {width}x{height}")
print(f"数据大小: {size} 字节")
print(f"每行字节数: {stride}")
else:
print("获取图像数据失败")
# 获取整个客户区
if ola.GetScreenData(0, 0, 0, 0, data, size, stride):
# ... 处理图像数据 ...
返回值
整型数:
- 1: 成功获取图像数据
- 0: 获取失败
注意事项
- 数据格式为BBGGRRAA(BGRA格式),每个像素占用4字节
- 图像尺寸可以通过stride和size计算得出
- 获取的数据指针保存在当前对象中,下次调用此接口时会自动释放
- 需要将数据拷贝到自己的字节集中再使用
- 坐标范围必须在有效范围内
- 建议在使用前检查坐标是否有效
- 处理大尺寸图像时注意内存使用
- 数据指针在下次调用前有效
- 如果需要保存图像,建议及时处理数据
- 建议在循环中获取图像时注意内存管理