主题
获取指定区域图象 - GetScreenDataPtr
函数简介
获取指定区域的图像。
接口名称
GetScreenDataPtrDLL调用
long GetScreenDataPtr(long ola, int x1, int y1, int x2, int y2);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| ola | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| x1 | 整数型 | 区域的左上X坐标。 |
| y1 | 整数型 | 区域的左上Y坐标。 |
| x2 | 整数型 | 区域的右下X坐标。 |
| y2 | 整数型 | 区域的右下Y坐标。 |
示例
基础:截屏得到 OLAImage 句柄
cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
// 用于 FindColor、MatchImageFromPtr 等
ola.FreeImage(imgPtr);
}csharp
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0)
{
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
ola = OLAPlugServer()
img_ptr = ola.GetScreenDataPtr(0, 0, 200, 200)
if img_ptr:
ola.FreeImage(img_ptr)java
import com.olaplug.OLAPlugServer;
OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) ola.FreeImage(imgPtr);cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
if(imgPtr) ola.FreeImage(imgPtr)vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
If imgPtr <> 0 Then ola.FreeImage(imgPtr)text
.局部变量 ola, OLAPlug
.局部变量 imgPtr, 长整数型
ola.创建 ()
imgPtr = ola.GetScreenDataPtr (0, 0, 200, 200)
.如果真 (imgPtr ≠ 0)
ola.FreeImagePtr (imgPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if(imgPtr) ola.FreeImage(imgPtr);text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
如果真 (imgPtr ≠ 0) ola.FreeImagePtr(imgPtr)cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) ola.FreeImage(imgPtr);推荐:导出字节流并写入磁盘
比 GetScreenData / GetScreenDataBmp 线程安全,是截屏后落盘或传给第三方库的推荐路径。
cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
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);
}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);
}csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0)
{
if (ola.GetImageData(imgPtr, out long dataPtr, out int size, out int stride) == 1)
{
byte[] bgra = new byte[size];
Marshal.Copy((IntPtr)dataPtr, bgra, 0, size);
File.WriteAllBytes(@"output\screen.bgra", bgra);
}
if (ola.GetImageBmpData(imgPtr, out long bmpPtr, out int bmpSize) == 1)
{
byte[] bmp = new byte[bmpSize];
Marshal.Copy((IntPtr)bmpPtr, bmp, 0, bmpSize);
File.WriteAllBytes(@"output\screen.bmp", bmp);
ola.FreeImageData(bmpPtr);
}
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
import ctypes
ola = OLAPlugServer()
img_ptr = ola.GetScreenDataPtr(0, 0, 200, 200)
if img_ptr:
ret, data_ptr, size, stride = ola.GetImageData(img_ptr)
if ret == 1:
with open("output/screen.bgra", "wb") as f:
f.write((ctypes.c_char * size).from_address(data_ptr))
ret, bmp_ptr, bmp_size = ola.GetImageBmpData(img_ptr)
if ret == 1:
with open("output/screen.bmp", "wb") as f:
f.write((ctypes.c_char * bmp_size).from_address(bmp_ptr))
ola.FreeImageData(bmp_ptr)
ola.FreeImage(img_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();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
var bgra = ola.GetImageData(imgPtr);
if (bgra != null && bgra.success) {
byte[] bytes = new Pointer(bgra.data.data).getByteArray(0, bgra.data.size);
Files.write(Paths.get("output/screen.bgra"), bytes);
}
var bmp = ola.GetImageBmpData(imgPtr);
if (bmp != null && bmp.success) {
byte[] bytes = new Pointer(bmp.data.data).getByteArray(0, bmp.data.size);
Files.write(Paths.get("output/screen.bmp"), bytes);
ola.FreeImageData(bmp.data.data);
}
ola.FreeImagePtr(imgPtr);
}cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
if(imgPtr) {
var ret = ola.GetImageData(imgPtr)
ola.WriteBytesToFile("output/screen.bgra", ret.data, ret.size)
ret = ola.GetImageBmpData(imgPtr)
ola.WriteBytesToFile("output/screen.bmp", ret.data, ret.size)
ola.FreeImageData(ret.data)
ola.FreeImage(imgPtr)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
If imgPtr <> 0 Then
ret = ola.GetImageData(imgPtr)
ola.WriteBytesToFile "output/screen.bgra", ret(0), ret(1)
ret = ola.GetImageBmpData(imgPtr)
ola.WriteBytesToFile "output/screen.bmp", ret(0), ret(1)
ola.FreeImageData ret(0)
ola.FreeImage(imgPtr)
End Ifaardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if(imgPtr){
var ret, dataPtr, size, stride = ola.GetImageData(imgPtr);
if(ret == 1) string(dataPtr, size).save("output/screen.bgra");
var ret2, bmpPtr, bmpSize = ola.GetImageBmpData(imgPtr);
if(ret2 == 1){
string(bmpPtr, bmpSize).save("output/screen.bmp");
ola.FreeImageData(bmpPtr);
}
ola.FreeImage(imgPtr);
}text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 dataPtr, 长整数型
.局部变量 bmpPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 bmpData, 字节集
.局部变量 size, 整数型
.局部变量 stride, 整数型
.局部变量 bmpSize, 整数型
ola.创建 ()
imgPtr = ola.GetScreenDataPtr (0, 0, 200, 200)
.如果真 (imgPtr ≠ 0)
ret = ola.GetImageData (imgPtr, dataPtr, size, stride)
.如果真 (ret = 1)
bgraData = 指针到字节集 (dataPtr, size)
写到文件 (“output/screen.bgra”, bgraData)
.如果真结束
ret = ola.GetImageBmpData (imgPtr, bmpPtr, bmpSize)
.如果真 (ret = 1)
bmpData = 指针到字节集 (bmpPtr, bmpSize)
写到文件 (“output/screen.bmp”, bmpData)
ola.FreeImageData (bmpPtr)
.如果真结束
ola.FreeImagePtr (imgPtr)
.如果真结束text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
如果真 (imgPtr ≠ 0)
{
长整数 dataPtr = 0, bmpPtr = 0
整数 size = 0, stride = 0, bmpSize = 0, ret = 0
ret = ola.GetImageData(imgPtr, dataPtr, size, stride)
如果真 (ret = 1)
{
变量 bgraData <类型 = 字节集类>
bgraData = 指针到字节集(dataPtr, size)
写到文件("output/screen.bgra", bgraData)
}
ret = ola.GetImageBmpData(imgPtr, bmpPtr, bmpSize)
如果真 (ret = 1)
{
变量 bmpData <类型 = 字节集类>
bmpData = 指针到字节集(bmpPtr, bmpSize)
写到文件("output/screen.bmp", bmpData)
ola.FreeImageData(bmpPtr)
}
ola.FreeImagePtr(imgPtr)
}cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
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);
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);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
GetImageData(instance, imgPtr, &dataPtr, &size, &stride);
WriteBytesToFile(instance, "output/screen.bgra", dataPtr, size);
FreeImagePtr(instance, imgPtr);
}csharp
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
GetImageData(instance, imgPtr, out long dataPtr, out int size, out int stride);
WriteBytesToFile(instance, @"output\screen.bgra", dataPtr, size);
FreeImagePtr(instance, imgPtr);python
img_ptr = ola.GetScreenDataPtr(instance, 0, 0, 200, 200)
data = c_int64(0); size = c_int(0); stride = c_int(0)
ola.GetImageData(instance, img_ptr, byref(data), byref(size), byref(stride))
ola.WriteBytesToFile(instance, b"output/screen.bgra", data, size)
ola.FreeImagePtr(instance, img_ptr)内存释放对照
| 步骤 | 对象 | 释放方式 |
|---|---|---|
GetScreenDataPtr | OLAImage 句柄 | FreeImagePtr |
GetImageData | 返回的 data | 不单独释放;随句柄 FreeImagePtr 失效,写盘须在释放前 |
GetImageBmpData | 返回的 BMP data | FreeImageData(与句柄独立) |
返回值
| 返回值 | 说明 |
|---|---|
| (返回值) | 长整数型:返回OLAImage对象的地址,失败返回0。 |
注意事项
| 项目 | 说明 |
|---|---|
| `x1 | x1, y1, x2, y2 全传 0 时为窗口整个客户区。 |
| 释放内存 | 返回的图像须 FreeImagePtr;配合 GetImageBmpData 时另须 FreeImageData 释放 BMP 缓冲。 |
| 格式 | 需要字节流落盘时,优先 本接口 + GetImageData / GetImageBmpData,而非 GetScreenData* 一步到位(后者线程不安全)。 |
