Skip to content

读取图片字节流 - GetImageData

函数简介

获取指定图像的二进制数据,数据格式BBGGRRAA(BGRA),每个像素4字节。

接口名称

GetImageData

DLL调用

int GetImageData(long ola, long ptr, long* data, int* size, int* stride);

参数说明

参数名类型说明
ola长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
ptr长整数型OLAImage对象的地址。
data长整数型指针返回图片的数据指针。
size整数型指针返回图片的数据长度。
stride整数型指针返回图片的步长数据(每行数据字节数)。

示例

以下示例演示 从 OLAImage 句柄导出 BGRA 原始字节流,并用 stride / size 解析宽高

  • width = stride / 4(每像素 4 字节 BGRA)
  • height = size / stride

推荐配合 GetScreenDataPtr 获取句柄(线程安全)。若只需宽高、不需要像素缓冲,也可直接用 GetImageSize

SDK 调用

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) {
        int width = stride / 4;          // BGRA:每像素 4 字节
        int height = size / stride;      // 总字节 / 行字节 = 行数
        // 使用 dataPtr / width / height ...
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
    }
    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)
    {
        int width = stride / 4;          // BGRA:每像素 4 字节
        int height = size / stride;      // 总字节 / 行字节 = 行数
        byte[] bgra = new byte[size];
        Marshal.Copy((IntPtr)dataPtr, bgra, 0, size);
        File.WriteAllBytes(@"output\screen.bgra", bgra);
    }
    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:
        width = stride // 4          # BGRA:每像素 4 字节
        height = size // stride      # 总字节 / 行字节 = 行数
        with open("output/screen.bgra", "wb") as f:
            f.write((ctypes.c_char * size).from_address(data_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 data = ola.GetImageData(imgPtr);
    if (data != null && data.success) {
        int stride = data.data.stride;
        int size = data.data.size;
        int width = stride / 4;          // BGRA:每像素 4 字节
        int height = size / stride;      // 总字节 / 行字节 = 行数
        byte[] bgra = new Pointer(data.data.data).getByteArray(0, size);
        Files.write(Paths.get("output/screen.bgra"), bgra);
    }
    ola.FreeImagePtr(imgPtr);
}
go
import "github.com/ola/olaplug/olaplug"

ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.GetScreenDataPtr(0, 0, 200, 200)
if imgPtr != 0 {
    dataPtr := 0; int size = 0, stride = 0
    if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
        int width = stride / 4          // BGRA:每像素 4 字节
        int height = size / stride      // 总字节 / 行字节 = 行数
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
    }
    ola.FreeImage(imgPtr)
}
rust
use olaplug::OLAPlugServer;

let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.get_screen_data_ptr(0, 0, 200, 200);
if imgPtr != 0 {
    let dataPtr = 0; int size = 0, stride = 0;
    if (ola.get_image_data(imgPtr, &mut dataPtr as *mut i32, &mut size as *mut i32, &mut stride as *mut i32) == 1) {
        let width = stride / 4;          // BGRA:每像素 4 字节
        let height = size / stride;      // 总字节 / 行字节 = 行数
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
    }
    ola.free_image(imgPtr);
}
cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
if(imgPtr) {
    var ret = ola.GetImageData(imgPtr)
    var width = ret.stride / 4          // BGRA:每像素 4 字节
    var height = ret.size / ret.stride  // 总字节 / 行字节 = 行数
    ola.WriteBytesToFile("output/screen.bgra", ret.data, ret.size)
    ola.FreeImage(imgPtr)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
If imgPtr <> 0 Then
    ret = ola.GetImageData(imgPtr)
    ' ret(0)=data, ret(1)=size, ret(2)=stride
    width = ret(2) / 4          ' BGRA:每像素 4 字节
    height = ret(1) / ret(2)    ' 总字节 / 行字节 = 行数
    ola.WriteBytesToFile "output/screen.bgra", ret(0), ret(1)
    ola.FreeImage(imgPtr)
End If
text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 dataPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 size, 整数型
.局部变量 stride, 整数型
.局部变量 width, 整数型
.局部变量 height, 整数型

ola.创建 ()
imgPtr = ola.GetScreenDataPtr (0, 0, 200, 200)
.如果真 (imgPtr ≠ 0)
    ret = ola.GetImageData (imgPtr, dataPtr, size, stride)
    .如果真 (ret = 1)
        width = stride ÷ 4
        height = size ÷ stride
        bgraData = 指针到字节集 (dataPtr, size)
        写到文件 (“output/screen.bgra”, bgraData)
    .如果真结束
    ola.FreeImagePtr (imgPtr)
.如果真结束
aardio
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){
        var width = stride / 4;          // BGRA:每像素 4 字节
        var height = size / stride;      // 总字节 / 行字节 = 行数
        string(dataPtr, size).save("output/screen.bgra");
    }
    ola.FreeImage(imgPtr);
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
如果真 (imgPtr ≠ 0)
{
    长整数 dataPtr = 0
    整数 size = 0, stride = 0, ret = 0, width = 0, height = 0
    ret = ola.GetImageData(imgPtr, dataPtr, size, stride)
    如果真 (ret = 1)
    {
        width = stride / 4
        height = size / stride
        变量 bgraData <类型 = 字节集类>
        bgraData = 指针到字节集(dataPtr, size)
        写到文件("output/screen.bgra", bgraData)
    }
    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) {
        int width = stride / 4;          // BGRA:每像素 4 字节
        int height = size / stride;      // 总字节 / 行字节 = 行数
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
    }
    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;
    if (GetImageData(instance, imgPtr, &dataPtr, &size, &stride) == 1) {
        int width = stride / 4;          // BGRA:每像素 4 字节
        int height = size / stride;      // 总字节 / 行字节 = 行数
        WriteBytesToFile(instance, "output/screen.bgra", dataPtr, size);
    }
    FreeImagePtr(instance, imgPtr);  // 勿对 dataPtr 调用 FreeImageData
}
csharp
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
    GetImageData(instance, imgPtr, out long dataPtr, out int size, out int stride);
    int width = stride / 4;          // BGRA:每像素 4 字节
    int height = size / stride;      // 总字节 / 行字节 = 行数
    byte[] copy = new byte[size];
    Marshal.Copy((IntPtr)dataPtr, copy, 0, size);
    File.WriteAllBytes(@"output\screen.bgra", copy);
    FreeImagePtr(instance, imgPtr);
}
python
img_ptr = ola.GetScreenDataPtr(instance, 0, 0, 200, 200)
if img_ptr:
    data = c_int64(0); size = c_int(0); stride = c_int(0)
    ola.GetImageData(instance, img_ptr, byref(data), byref(size), byref(stride))
    width = stride.value // 4          # BGRA:每像素 4 字节
    height = size.value // stride.value  # 总字节 / 行字节 = 行数
    raw = (c_char * size.value).from_address(data.value)
    open("output/screen.bgra", "wb").write(raw)
    ola.FreeImagePtr(instance, img_ptr)

返回值

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

注意事项

本接口返回的 data 是句柄内部像素视图,不要 调用 FreeImageData;只需(并必须)在用完后 FreeImagePtr(imgPtr)FreeImagePtr 也不会替你释放 BMP/PNG 导出缓冲——那是另一套所有权。完整对照见 图像处理模块总览 · 所有权对照

字节流 / 句柄所有权对照

接口对象是什么如何释放
GetImageData(本接口)句柄内部的 BGRA 像素视图(与 OLAImage 同生命周期)只调 FreeImagePtr(imgPtr)禁止 FreeImageData(data)
GetImageBmpData新分配的完整 BMP 文件字节必须 FreeImageData(data),句柄另调 FreeImagePtr
GetImagePngData新分配的完整 PNG 文件字节必须 FreeImageData(data),句柄另调 FreeImagePtr
FreeImagePtr释放 OLAImage 图像句柄释放上述 BMP/PNG 的 data
FreeImageData释放独立堆分配的字节缓冲释放图像句柄
项目说明
数据格式BGRA(字节顺序 B-G-R-A),每像素 4 字节;width = stride / 4height = size / stride
生命周期data 与 OLAImage 句柄绑定,调用 FreeImagePtr 后即失效;写盘或 memcpy 须在释放句柄 之前 完成。
推荐写法GetScreenDataPtr + GetImageData + FreeImagePtr,替代线程不安全的 GetScreenData
各语言写盘先将 data 拷贝到语言原生字节数组再落盘(易语言 指针到字节集、C# Marshal.Copy、Python from_address 等)。
格式若需标准图片文件,优先用 GetImageBmpData 导出 BMP。