Skip to content

截图返回字节流 - GetScreenDataBmp

函数简介

获取指定区域的图像数据,以BMP格式二进制数据返回。此接口线程不安全,不推荐使用。

接口名称

GetScreenDataBmp

DLL调用

int GetScreenDataBmp(long ola, int x1, int y1, int x2, int y2, long* data, int* size);

参数说明

参数名类型说明
ola长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
x1整数型区域的左上X坐标。
y1整数型区域的左上Y坐标。
x2整数型区域的右下X坐标。
y2整数型区域的右下Y坐标。
data长整数型指针返回BMP图片数据的指针地址。
size整数型指针返回BMP图片数据的总长度(字节数)。

示例

不推荐 在多线程或循环截屏中直接使用本接口。推荐 GetScreenDataPtr + GetImageBmpData(见文末)。

以下演示 直接截屏得到 BMP 字节流并写盘;写出的文件为标准 BMP,可直接用图片查看器打开。

SDK 调用

cpp
#include "OLAPlugServer.h"
#include <fstream>

OLAPlugServer ola;
long bmpPtr = 0; int dataLen = 0;
if (ola.GetScreenDataBmp(0, 0, 200, 200, &bmpPtr, &dataLen) == 1) {
    std::ofstream("output/screen.bmp", std::ios::binary).write((const char*)bmpPtr, dataLen);
    ola.FreeImageData(bmpPtr);
}
csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;

var ola = new OLAPlugServer();
if (ola.GetScreenDataBmp(0, 0, 200, 200, out long bmpPtr, out int dataLen) == 1)
{
    byte[] bmp = new byte[dataLen];
    Marshal.Copy((IntPtr)bmpPtr, bmp, 0, dataLen);
    File.WriteAllBytes(@"output\screen.bmp", bmp);
    ola.FreeImageData(bmpPtr);
}
python
from OLAPlugServer import OLAPlugServer
import ctypes

ola = OLAPlugServer()
ret, bmp_ptr, data_len = ola.GetScreenDataBmp(0, 0, 200, 200)
if ret == 1:
    with open("output/screen.bmp", "wb") as f:
        f.write((ctypes.c_char * data_len).from_address(bmp_ptr))
    ola.FreeImageData(bmp_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.GetScreenDataBmp(0, 0, 200, 200);
if (result != null && result.success) {
    byte[] bmp = new Pointer(result.data.data).getByteArray(0, result.data.size);
    Files.write(Paths.get("output/screen.bmp"), bmp);
    ola.FreeImageData(result.data.data);
}
cpp
var ola = com("OlaPlug.OlaSoft")
var ret = ola.GetScreenDataBmp(0, 0, 200, 200)
if(ret) {
    ola.WriteBytesToFile("output/screen.bmp", ret.data, ret.size)
    ola.FreeImageData(ret.data)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
ret = ola.GetScreenDataBmp(0, 0, 200, 200)
If ret(0) = 1 Then
    ola.WriteBytesToFile "output/screen.bmp", ret(1), ret(2)
    ola.FreeImageData ret(1)
End If
text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 bmpPtr, 长整数型
.局部变量 bmpData, 字节集
.局部变量 dataLen, 整数型

ola.创建 ()
ret = ola.GetScreenDataBmp (0, 0, 200, 200, bmpPtr, dataLen)
.如果真 (ret = 1)
    bmpData = 指针到字节集 (bmpPtr, dataLen)
    写到文件 (“output/screen.bmp”, bmpData)
    ola.FreeImageData (bmpPtr)
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var ret, bmpPtr, dataLen = ola.GetScreenDataBmp(0, 0, 200, 200);
if(ret == 1){
    string(bmpPtr, dataLen).save("output/screen.bmp");
    ola.FreeImageData(bmpPtr);
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 bmpPtr = 0
整数 dataLen = 0, ret = 0
ret = ola.GetScreenDataBmp(0, 0, 200, 200, bmpPtr, dataLen)
如果真 (ret = 1)
{
    变量 bmpData <类型 = 字节集类>
    bmpData = 指针到字节集(bmpPtr, dataLen)
    写到文件("output/screen.bmp", bmpData)
    ola.FreeImageData(bmpPtr)
}
cpp
#include "OLAPlugServer.h"
#include <fstream>

OLAPlugServer ola;
long bmpPtr = 0; int dataLen = 0;
if (ola.GetScreenDataBmp(0, 0, 200, 200, &bmpPtr, &dataLen) == 1) {
    std::ofstream("output/screen.bmp", std::ios::binary).write((const char*)bmpPtr, dataLen);
    ola.FreeImageData(bmpPtr);
}

原生 DLL 调用

cpp
long instance = CreateCOLAPlugInterFace();
long bmpPtr = 0; int bmpSize = 0;
if (GetScreenDataBmp(instance, 0, 0, 200, 200, &bmpPtr, &bmpSize) == 1) {
    WriteBytesToFile(instance, "output/screen.bmp", bmpPtr, bmpSize);
    FreeImageData(instance, bmpPtr);
}
csharp
GetScreenDataBmp(instance, 0, 0, 200, 200, out long bmpPtr, out int bmpSize);
WriteBytesToFile(instance, @"output\screen.bmp", bmpPtr, bmpSize);
FreeImageData(instance, bmpPtr);
python
bmp = c_int64(0); size = c_int(0)
ola.GetScreenDataBmp(instance, 0, 0, 200, 200, byref(bmp), byref(size))
ola.WriteBytesToFile(instance, b"output/screen.bmp", bmp, size)
ola.FreeImageData(instance, bmp)

推荐替代方案(线程安全)

cpp
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        std::ofstream("output/screen.bmp", std::ios::binary).write((const char*)bmpPtr, bmpSize);
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}

返回值

返回值说明
1成功。
0失败。

注意事项

项目说明
线程不安全请优先使用 GetScreenDataPtr + GetImageBmpData + FreeImagePtr
格式返回 标准 BMP(含文件头),可直接写入 .bmp 文件。
释放内存写盘完成后须 FreeImageData;缓冲在下次调用本接口前有效。
窗口绑定x1, y1, x2, y2 全传 0 时为绑定窗口整个客户区。
格式落盘后可用 语言原生读文件 + LoadImageFromBmpData 重新载入(BMP 无需 stride)。