Skip to content

读取图片BMP字节流 - GetImageBmpData

函数简介

获取指定图像,用BMP数据格式返回。

接口名称

GetImageBmpData

DLL调用

int GetImageBmpData(long ola, long ptr, long* data, int* size);

参数说明

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

示例

以下示例演示 OLAImage → BMP 字节流 → 磁盘文件,以及 磁盘 BMP → LoadImageFromBmpData 的反向载入。

SDK 调用

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

OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        std::ofstream("output/export.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.LoadImage(@"images\test.bmp");
if (imgPtr != 0)
{
    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\export.bmp", bmp);
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}
python
from OLAPlugServer import OLAPlugServer
import ctypes

ola = OLAPlugServer()
img_ptr = ola.LoadImage("images/test.bmp")
if img_ptr:
    ret, bmp_ptr, bmp_size = ola.GetImageBmpData(img_ptr)
    if ret == 1:
        with open("output/export.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.LoadImage("images/test.bmp");
if (imgPtr != 0) {
    var bmp = ola.GetImageBmpData(imgPtr);
    if (bmp != null && bmp.success) {
        byte[] outBytes = new Pointer(bmp.data.data).getByteArray(0, bmp.data.size);
        Files.write(Paths.get("output/export.bmp"), outBytes);
        ola.FreeImageData(bmp.data.data);
    }
    ola.FreeImagePtr(imgPtr);
}
cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.LoadImage("images/test.bmp")
if(imgPtr) {
    var ret = ola.GetImageBmpData(imgPtr)
    ola.WriteBytesToFile("output/export.bmp", ret.data, ret.size)
    ola.FreeImageData(ret.data)
    ola.FreeImage(imgPtr)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.LoadImage("images/test.bmp")
If imgPtr <> 0 Then
    ret = ola.GetImageBmpData(imgPtr)
    ola.WriteBytesToFile "output/export.bmp", ret(0), ret(1)
    ola.FreeImageData ret(0)
    ola.FreeImage(imgPtr)
End If
text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 bmpPtr, 长整数型
.局部变量 bmpOut, 字节集
.局部变量 bmpSize, 整数型

ola.创建 ()
imgPtr = ola.LoadImage (“images/test.bmp”)
.如果真 (imgPtr ≠ 0)
    ret = ola.GetImageBmpData (imgPtr, bmpPtr, bmpSize)
    .如果真 (ret = 1)
        bmpOut = 指针到字节集 (bmpPtr, bmpSize)
        写到文件 (“output/export.bmp”, bmpOut)
        ola.FreeImageData (bmpPtr)
    .如果真结束
    ola.FreeImagePtr (imgPtr)
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.LoadImage("images/test.bmp");
if(imgPtr){
    var ret, bmpPtr, bmpSize = ola.GetImageBmpData(imgPtr);
    if(ret == 1){
        string(bmpPtr, bmpSize).save("output/export.bmp");
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.LoadImage("images/test.bmp")
如果真 (imgPtr ≠ 0)
{
    长整数 bmpPtr = 0
    整数 bmpSize = 0, ret = 0
    ret = ola.GetImageBmpData(imgPtr, bmpPtr, bmpSize)
    如果真 (ret = 1)
    {
        变量 bmpOut <类型 = 字节集类>
        bmpOut = 指针到字节集(bmpPtr, bmpSize)
        写到文件("output/export.bmp", bmpOut)
        ola.FreeImageData(bmpPtr)
    }
    ola.FreeImagePtr(imgPtr)
}
cpp
#include "OLAPlugServer.h"
#include <fstream>

OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        std::ofstream("output/export.bmp", std::ios::binary).write((const char*)bmpPtr, bmpSize);
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}

原生 DLL 调用

cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = LoadImage(instance, "images/test.bmp");
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    GetImageBmpData(instance, imgPtr, &bmpPtr, &bmpSize);
    WriteBytesToFile(instance, "output/export.bmp", bmpPtr, bmpSize);
    FreeImageData(instance, bmpPtr);
    FreeImagePtr(instance, imgPtr);
}
csharp
GetImageBmpData(instance, imgPtr, out long bmpPtr, out int bmpSize);
WriteBytesToFile(instance, @"output\export.bmp", bmpPtr, bmpSize);
FreeImageData(instance, bmpPtr);
FreeImagePtr(instance, imgPtr);
python
data = c_int64(0); size = c_int(0)
ola.GetImageBmpData(instance, img_ptr, byref(data), byref(size))
ola.WriteBytesToFile(instance, b"output/export.bmp", data, size)
ola.FreeImageData(instance, data)
ola.FreeImagePtr(instance, img_ptr)

返回值

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

注意事项

项目说明
GetImageBmpData 返回的 data须调用 FreeImageData 释放。
来源 OLAImage 句柄须调用 FreeImagePtr / SDK FreeImage 释放。
输出格式返回 标准 BMP 文件格式(含文件头),可直接写入 .bmp 扩展名文件并用系统查看器打开。
释放时机写盘或网络发送完成后 必须 调用 FreeImageData,否则泄漏。
与 GetImageData 区别GetImageData 不同:BMP 缓冲由插件 单独分配,与句柄生命周期无关,但句柄本身仍需 FreeImagePtr
推荐截图流程GetScreenDataPtr + GetImageBmpData + FreeImageData + FreeImagePtr,替代 GetScreenDataBmp