Skip to content

载入bmp图片 - LoadImageFromBmpData

函数简介

将BMP图片数据载入内存。

接口名称

LoadImageFromBmpData

DLL调用

long LoadImageFromBmpData(long ola, long data, long dataSize);

参数说明

参数名类型说明
ola长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
data长整数型图片内存地址。
dataSize长整数型图片的大小。

示例

以下示例演示 从磁盘读取 BMP 文件 → 载入内存图 → 再导出 BMP 写回磁盘 的完整流程,并标注各步内存由谁分配、由谁释放。

SDK 调用

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

OLAPlugServer ola;
const char* bmpPath = "images/test.bmp";
const char* outPath = "output/export.bmp";

std::ifstream ifs(bmpPath, std::ios::binary | std::ios::ate);
if (!ifs) return;
long fileSize = (long)ifs.tellg();
ifs.seekg(0);
std::vector<unsigned char> bmp(fileSize);
ifs.read((char*)bmp.data(), fileSize);

long imgPtr = ola.LoadImageFromBmpData((long)bmp.data(), fileSize);
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        std::ofstream(outPath, 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();
byte[] bmp = File.ReadAllBytes(@"images\test.bmp");
GCHandle pin = GCHandle.Alloc(bmp, GCHandleType.Pinned);
try {
    long imgPtr = ola.LoadImageFromBmpData(pin.AddrOfPinnedObject().ToInt64(), bmp.Length);
    if (imgPtr != 0) {
        if (ola.GetImageBmpData(imgPtr, out long bmpPtr, out int bmpSize) == 1) {
            byte[] outBytes = new byte[bmpSize];
            Marshal.Copy((IntPtr)bmpPtr, outBytes, 0, bmpSize);
            File.WriteAllBytes(@"output\export.bmp", outBytes);
            ola.FreeImageData(bmpPtr);
        }
        ola.FreeImage(imgPtr);
    }
} finally { pin.Free(); }
python
from OLAPlugServer import OLAPlugServer
import ctypes

ola = OLAPlugServer()
with open("images/test.bmp", "rb") as f:
    bmp_bytes = f.read()
buf = ctypes.create_string_buffer(bmp_bytes, len(bmp_bytes))
img_ptr = ola.LoadImageFromBmpData(ctypes.addressof(buf), len(bmp_bytes))
if img_ptr:
    ret, bmp_ptr, bmp_size = ola.GetImageBmpData(img_ptr)
    if ret == 1:
        with open("output/export.bmp", "wb") as out:
            out.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.Memory;
import com.sun.jna.Pointer;
import java.nio.file.Files;
import java.nio.file.Paths;

OLAPlugServer ola = new OLAPlugServer();
byte[] bmp = Files.readAllBytes(Paths.get("images/test.bmp"));
Memory mem = new Memory(bmp.length);
mem.write(0, bmp, 0, bmp.length);
long imgPtr = ola.LoadImageFromBmpData(Pointer.nativeValue(mem), bmp.length);
if (imgPtr != 0) {
    var bmpResult = ola.GetImageBmpData(imgPtr);
    if (bmpResult != null && bmpResult.success) {
        byte[] outBytes = new Pointer(bmpResult.data.data).getByteArray(0, bmpResult.data.size);
        Files.write(Paths.get("output/export.bmp"), outBytes);
        ola.FreeImageData(bmpResult.data.data);
    }
    ola.FreeImagePtr(imgPtr);
}
cpp
var ola = com("OlaPlug.OlaSoft")
var fileSize = ola.GetFileSize("images/test.bmp")
var filePtr = ola.ReadBytesFromFile("images/test.bmp", 0, 0)
if(filePtr && fileSize > 0) {
    var imgPtr = ola.LoadImageFromBmpData(filePtr, fileSize)
    ola.FreeMemoryPtr(filePtr)
    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")
fileSize = ola.GetFileSize("images/test.bmp")
filePtr = ola.ReadBytesFromFile("images/test.bmp", 0, 0)
If filePtr <> 0 And fileSize > 0 Then
    imgPtr = ola.LoadImageFromBmpData(filePtr, fileSize)
    ola.FreeMemoryPtr(filePtr)
    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
End If
text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 bmpData, 字节集
.局部变量 bmpOut, 字节集
.局部变量 imgPtr, 长整数型
.局部变量 bmpPtr, 长整数型
.局部变量 bmpSize, 整数型

ola.创建 ()
bmpData = 读入文件 (“images/test.bmp”, )
.如果真 (取字节集长度 (bmpData) > 0)
    imgPtr = ola.LoadImageFromBmpData (取变量数据地址 (bmpData), 取字节集长度 (bmpData))
    .如果真 (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 bmpData = io.load("images/test.bmp");
var imgPtr = ola.LoadImageFromBmpData(bmpData, #bmpData);
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
变量 bmpData <类型 = 字节集类>

bmpData = 读入文件("images/test.bmp", )
如果真 (取字节集长度(bmpData) > 0)
{
    长整数 imgPtr = ola.LoadImageFromBmpData(取字节集指针(bmpData), 取字节集长度(bmpData))
    如果真 (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>
#include <vector>

OLAPlugServer ola;
std::ifstream ifs("images/test.bmp", std::ios::binary | std::ios::ate);
long fileSize = (long)ifs.tellg();
ifs.seekg(0);
std::vector<unsigned char> bmp(fileSize);
ifs.read((char*)bmp.data(), fileSize);

long imgPtr = ola.LoadImageFromBmpData((long)bmp.data(), fileSize);
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
#include <fstream>
#include <vector>

long instance = CreateCOLAPlugInterFace();
const char* bmpPath = "images/test.bmp";

// ① 用标准库读 BMP 到 std::vector(也可改用 ReadBytesFromFile + FreeMemoryPtr)
std::ifstream ifs(bmpPath, std::ios::binary | std::ios::ate);
auto fileSize = (long)ifs.tellg();
ifs.seekg(0);
std::vector<unsigned char> buf(fileSize);
ifs.read((char*)buf.data(), fileSize);

// ② 载入 OLAImage
long imgPtr = LoadImageFromBmpData(instance, (long)buf.data(), fileSize);
// buf 为栈上/堆上自有内存,由 vector 析构释放,与插件无关

if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (GetImageBmpData(instance, imgPtr, &bmpPtr, &bmpSize) == 1) {
        WriteBytesToFile(instance, "output/export.bmp", bmpPtr, bmpSize);
        FreeImageData(instance, bmpPtr);  // 释放 GetImageBmpData 缓冲
    }
    FreeImagePtr(instance, imgPtr);
}
csharp
using System.IO;
using System.Runtime.InteropServices;

[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern long CreateCOLAPlugInterFace();
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern long LoadImageFromBmpData(long ola, long data, long dataSize);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetImageBmpData(long ola, long ptr, out long data, out int size);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int WriteBytesToFile(long ola, string path, long dataAddr, int dataSize);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int FreeImageData(long ola, long ptr);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int FreeImagePtr(long ola, long imagePtr);

long instance = CreateCOLAPlugInterFace();
byte[] bmpBytes = File.ReadAllBytes(@"images\test.bmp");
GCHandle pin = GCHandle.Alloc(bmpBytes, GCHandleType.Pinned);
try {
    long imgPtr = LoadImageFromBmpData(instance, pin.AddrOfPinnedObject().ToInt64(), bmpBytes.Length);
    if (imgPtr != 0) {
        GetImageBmpData(instance, imgPtr, out long bmpPtr, out int bmpSize);
        WriteBytesToFile(instance, @"output\export.bmp", bmpPtr, bmpSize);
        FreeImageData(instance, bmpPtr);
        FreeImagePtr(instance, imgPtr);
    }
} finally { pin.Free(); }
python
from ctypes import CDLL, c_int, c_int64, byref, create_string_buffer

ola = CDLL("OLAPlug_x64.dll")
ola.CreateCOLAPlugInterFace.restype = c_int64
ola.LoadImageFromBmpData.restype = c_int64
instance = ola.CreateCOLAPlugInterFace()

with open("images/test.bmp", "rb") as f:
    bmp_bytes = f.read()
buf = create_string_buffer(bmp_bytes, len(bmp_bytes))

img_ptr = ola.LoadImageFromBmpData(instance, c_int64(id(buf.raw)), len(bmp_bytes))
if img_ptr:
    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)

返回值

返回值说明
(返回值)长整数型:返回OLAImage对象的地址,失败返回0。

注意事项

项目说明
ReadBytesFromFile 返回的指针FreeMemoryPtr 释放;载入成功后即可释放,图像已拷贝。
LoadImageFromBmpData 返回的句柄FreeImagePtr / SDK FreeImage 释放;OLAImage 生命周期结束必须释放。
GetImageBmpData 返回的 BMP 指针FreeImageData 释放;写盘或拷贝完成后释放。
数据格式data 必须是 完整 BMP 文件字节(含文件头),与 GetImageBmpData 导出格式一致。
各语言 I/O读盘优先原生字节数组;写盘先 指针到字节集 / Marshal.Copy / from_address 拷贝再落盘;BMP 无需 stride
适用场景若只需从路径加载,可直接用 LoadImage;本接口适合 网络下载、内存拼接 等无文件路径场景。