主题
截图返回字节流 - GetScreenData
函数简介
获取指定区域的图像数据,以BGRA格式二进制数据返回,每个像素占用4字节。此接口线程不安全,不推荐使用。
接口名称
GetScreenDataDLL调用
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 | 整数型指针 | 返回图片每行数据的字节数。 |
示例
不推荐 在多线程或循环截屏中直接使用本接口(线程不安全、内部复用缓冲)。推荐写法见文末「推荐替代方案」。
以下演示 直接截屏得到 BGRA 字节流并写盘 的完整流程。
SDK 调用
cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long dataPtr = 0; int dataLen = 0, stride = 0;
if (ola.GetScreenData(0, 0, 200, 200, &dataPtr, &dataLen, &stride) == 1) {
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, dataLen);
ola.FreeImageData(dataPtr);
}csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;
var ola = new OLAPlugServer();
if (ola.GetScreenData(0, 0, 200, 200, out long dataPtr, out int dataLen, out int stride) == 1)
{
byte[] bgra = new byte[dataLen];
Marshal.Copy((IntPtr)dataPtr, bgra, 0, dataLen);
File.WriteAllBytes(@"output\screen.bgra", bgra);
ola.FreeImageData(dataPtr);
}python
from OLAPlugServer import OLAPlugServer
import ctypes
ola = OLAPlugServer()
ret, data_ptr, data_len, stride = ola.GetScreenData(0, 0, 200, 200)
if ret == 1:
with open("output/screen.bgra", "wb") as f:
f.write((ctypes.c_char * data_len).from_address(data_ptr))
ola.FreeImageData(data_ptr)java
import com.olaplug.OLAPlugServer;
import com.sun.jna.Pointer;
import java.nio.file.Files;
import java.nio.file.Paths;
OLAPlugServer ola = new OLAPlugServer();
var result = ola.GetScreenData(0, 0, 200, 200);
if (result != null && result.success) {
byte[] bgra = new Pointer(result.data.data).getByteArray(0, result.data.size);
Files.write(Paths.get("output/screen.bgra"), bgra);
ola.FreeImageData(result.data.data);
}cpp
var ola = com("OlaPlug.OlaSoft")
var ret = ola.GetScreenData(0, 0, 200, 200)
if(ret) {
ola.WriteBytesToFile("output/screen.bgra", ret.data, ret.size)
ola.FreeImageData(ret.data)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
ret = ola.GetScreenData(0, 0, 200, 200)
If ret(0) = 1 Then
ola.WriteBytesToFile "output/screen.bgra", ret(1), ret(2)
ola.FreeImageData ret(1)
End Iftext
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 dataPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 dataLen, 整数型
.局部变量 stride, 整数型
ola.创建 ()
ret = ola.GetScreenData (0, 0, 200, 200, dataPtr, dataLen, stride)
.如果真 (ret = 1)
bgraData = 指针到字节集 (dataPtr, dataLen)
写到文件 (“output/screen.bgra”, bgraData)
ola.FreeImageData (dataPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var ret, dataPtr, dataLen, stride = ola.GetScreenData(0, 0, 200, 200);
if(ret == 1){
string(dataPtr, dataLen).save("output/screen.bgra");
ola.FreeImageData(dataPtr);
}text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 dataPtr = 0
整数 dataLen = 0, stride = 0, ret = 0
ret = ola.GetScreenData(0, 0, 200, 200, dataPtr, dataLen, stride)
如果真 (ret = 1)
{
变量 bgraData <类型 = 字节集类>
bgraData = 指针到字节集(dataPtr, dataLen)
写到文件("output/screen.bgra", bgraData)
ola.FreeImageData(dataPtr)
}cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long dataPtr = 0; int dataLen = 0, stride = 0;
if (ola.GetScreenData(0, 0, 200, 200, &dataPtr, &dataLen, &stride) == 1) {
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, dataLen);
ola.FreeImageData(dataPtr);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long dataPtr = 0; int size = 0, stride = 0;
if (GetScreenData(instance, 0, 0, 200, 200, &dataPtr, &size, &stride) == 1) {
WriteBytesToFile(instance, "output/screen.bgra", dataPtr, size);
FreeImageData(instance, dataPtr);
}csharp
GetScreenData(instance, 0, 0, 200, 200, out long dataPtr, out int size, out int stride);
WriteBytesToFile(instance, @"output\screen.bgra", dataPtr, size);
FreeImageData(instance, dataPtr);python
data = c_int64(0); size = c_int(0); stride = c_int(0)
ola.GetScreenData(instance, 0, 0, 200, 200, byref(data), byref(size), byref(stride))
ola.WriteBytesToFile(instance, b"output/screen.bgra", data, size)
ola.FreeImageData(instance, data)推荐替代方案(线程安全)
cpp
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
}
ola.FreeImage(imgPtr);
}详见 GetScreenDataPtr 与 GetImageData。
返回值
| 返回值 | 说明 |
|---|---|
1 | 成功。 |
0 | 失败。 |
注意事项
| 项目 | 说明 |
|---|---|
| 线程不安全 | 多线程或高频循环截屏请改用 GetScreenDataPtr + GetImageData。 |
| 数据格式 | BGRA,每像素 4 字节;width = stride / 4,height = size / stride。 |
| 生命周期 | 返回的 data 在 下次调用本接口前 有效;写盘/拷贝后调用 FreeImageData 释放。 |
| 窗口绑定 | x1, y1, x2, y2 全传 0 时截取绑定窗口 整个客户区。 |
| 格式 | 若需要标准 BMP 文件,请用 GetScreenDataBmp 或推荐的 GetScreenDataPtr + GetImageBmpData。 |
