Skip to content

加载图片 - LoadImageFromRGBData

函数简介

从RGB数据加载图片到内存,适用于采集卡或其他RGB数据源。

接口名称

LoadImageFromRGBData

DLL调用

long LoadImageFromRGBData(long ola, int width, int height, long rgbdata, int stride);

参数说明

参数名类型说明
ola长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
width整数型图片宽度,单位像素。
height整数型图片高度,单位像素。
rgbdata长整数型RGB图片数据的地址。
stride整数型RGB图片数据的行跨度(每行字节数),通常为 width * 3。

示例

以下示例演示 从磁盘读取 24 位 RGB 原始像素文件 → 载入 OLAImage → 导出 BGRA 字节流写盘

参数从哪来?.rgb 文件 不含宽高头widthheight 须由采集卡分辨率、帧协议或业务配置给出;stride 为每行字节数,无行对齐时 stride = width × 3(24 位 RGB)。标准 BMP/PNG/JPG 请直接用 LoadImageLoadImageFromBmpData

SDK 调用

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

OLAPlugServer ola;
const char* rgbPath = "images/frame.rgb";
const char* outPath = "output/frame.bgra";
int width = 800, height = 600;   // 采集卡/帧协议/配置给出,裸 .rgb 不含宽高
int stride = width * 3;          // 由 width 推导,非硬编码 magic number

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

long imgPtr = ola.LoadImageFromRGBData(width, height, (long)rgb.data(), stride);
if (imgPtr != 0) {
    long dataPtr = 0; int size = 0, outStride = 0;
    if (ola.GetImageData(imgPtr, &dataPtr, &size, &outStride) == 1) {
        std::ofstream(outPath, 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();
int width = 800, height = 600, stride = width * 3;
byte[] rgb = File.ReadAllBytes(@"images\frame.rgb");
if (rgb.Length < stride * height) return;

GCHandle pin = GCHandle.Alloc(rgb, GCHandleType.Pinned);
try {
    long imgPtr = ola.LoadImageFromRGBData(width, height, pin.AddrOfPinnedObject().ToInt64(), stride);
    if (imgPtr != 0) {
        if (ola.GetImageData(imgPtr, out long dataPtr, out int size, out int _) == 1) {
            byte[] bgra = new byte[size];
            Marshal.Copy((IntPtr)dataPtr, bgra, 0, size);
            File.WriteAllBytes(@"output\frame.bgra", bgra);
        }
        ola.FreeImage(imgPtr);
    }
} finally { pin.Free(); }
python
from OLAPlugServer import OLAPlugServer
import ctypes

ola = OLAPlugServer()
width, height = 800, 600
stride = width * 3

with open("images/frame.rgb", "rb") as f:
    rgb_bytes = f.read()
if len(rgb_bytes) >= stride * height:
    buf = ctypes.create_string_buffer(rgb_bytes, len(rgb_bytes))
    img_ptr = ola.LoadImageFromRGBData(width, height, ctypes.addressof(buf), stride)
    if img_ptr:
        ret, data_ptr, size, _ = ola.GetImageData(img_ptr)
        if ret == 1:
            with open("output/frame.bgra", "wb") as out:
                out.write((ctypes.c_char * size).from_address(data_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();
int width = 800, height = 600, stride = width * 3;
byte[] rgb = Files.readAllBytes(Paths.get("images/frame.rgb"));
if (rgb.length >= stride * height) {
    Memory mem = new Memory(rgb.length);
    mem.write(0, rgb, 0, rgb.length);
    long imgPtr = ola.LoadImageFromRGBData(width, height, Pointer.nativeValue(mem), stride);
    if (imgPtr != 0) {
        var data = ola.GetImageData(imgPtr);
        if (data != null && data.success) {
            byte[] bgra = new Pointer(data.data.data).getByteArray(0, data.data.size);
            Files.write(Paths.get("output/frame.bgra"), bgra);
        }
        ola.FreeImagePtr(imgPtr);
    }
}
cpp
var ola = com("OlaPlug.OlaSoft")
var width = 800, height = 600, stride = width * 3

var rgbPtr = ola.ReadBytesFromFile("images/frame.rgb", 0, 0)
var imgPtr = ola.LoadImageFromRGBData(width, height, rgbPtr, stride)
ola.FreeMemoryPtr(rgbPtr)

if(imgPtr) {
    var ret = ola.GetImageData(imgPtr)
    ola.WriteBytesToFile("output/frame.bgra", ret.data, ret.size)
    ola.FreeImage(imgPtr)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
width = 800 : height = 600 : stride = width * 3

rgbPtr = ola.ReadBytesFromFile("images/frame.rgb", 0, 0)
imgPtr = ola.LoadImageFromRGBData(width, height, rgbPtr, stride)
ola.FreeMemoryPtr(rgbPtr)

If imgPtr <> 0 Then
    ret = ola.GetImageData(imgPtr)
    ola.WriteBytesToFile "output/frame.bgra", ret(0), ret(1)
    ola.FreeImage(imgPtr)
End If
text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 width, 整数型
.局部变量 height, 整数型
.局部变量 stride, 整数型
.局部变量 rgbData, 字节集
.局部变量 imgPtr, 长整数型
.局部变量 dataPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 size, 整数型
.局部变量 outStride, 整数型

ola.创建 ()
' width/height 不来自 .rgb 文件,须由采集卡/帧头/配置给出(示例 800×600)
width = 800
height = 600
stride = width × 3  ' 24 位 RGB 每行字节数;源缓冲有行对齐 padding 时传实际 pitch

rgbData = 读入文件 (“images/frame.rgb”, )
.如果真 (取字节集长度 (rgbData) ≥ stride × height)
    imgPtr = ola.LoadImageFromRGBData (width, height, 取变量数据地址 (rgbData), stride)
    .如果真 (imgPtr ≠ 0)
        ret = ola.GetImageData (imgPtr, dataPtr, size, outStride)
        .如果真 (ret = 1)
            bgraData = 指针到字节集 (dataPtr, size)
            写到文件 (“output/frame.bgra”, bgraData)
        .如果真结束
        ola.FreeImagePtr (imgPtr)  ' dataPtr 随句柄释放,勿 FreeImageData
    .如果真结束
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var width = 800, height = 600, stride = width * 3;

var rgbData = io.load("images/frame.rgb");
if( #rgbData >= stride * height ){
    var imgPtr = ola.LoadImageFromRGBData(width, height, rgbData, stride);
    if(imgPtr){
        var ret, dataPtr, size, outStride = ola.GetImageData(imgPtr);
        if(ret == 1) string(dataPtr, size).save("output/frame.bgra");
        ola.FreeImage(imgPtr);
    }
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
整数 width = 800, height = 600, stride = width * 3
变量 rgbData <类型 = 字节集类>

rgbData = 读入文件("images/frame.rgb", )
如果真 (取字节集长度(rgbData) >= stride * height)
{
    长整数 imgPtr = ola.LoadImageFromRGBData(width, height, 取字节集指针(rgbData), stride)
    如果真 (imgPtr ≠ 0)
    {
        长整数 dataPtr = 0
        整数 size = 0, outStride = 0, ret = 0
        ret = ola.GetImageData(imgPtr, dataPtr, size, outStride)
        如果真 (ret = 1)
        {
            变量 bgraData <类型 = 字节集类>
            bgraData = 指针到字节集(dataPtr, size)
            写到文件("output/frame.bgra", bgraData)
        }
        ola.FreeImagePtr(imgPtr)
    }
}
cpp
#include "OLAPlugServer.h"
#include <fstream>
#include <vector>

OLAPlugServer ola;
int width = 800, height = 600, stride = width * 3;

std::ifstream ifs("images/frame.rgb", std::ios::binary | std::ios::ate);
auto fileSize = (long)ifs.tellg();
ifs.seekg(0);
std::vector<unsigned char> rgb(fileSize);
ifs.read((char*)rgb.data(), fileSize);
if (fileSize >= (long)stride * height) {
    long imgPtr = ola.LoadImageFromRGBData(width, height, (long)rgb.data(), stride);
    if (imgPtr != 0) {
        long dataPtr = 0; int size = 0, outStride = 0;
        if (ola.GetImageData(imgPtr, &dataPtr, &size, &outStride) == 1) {
            std::ofstream("output/frame.bgra", std::ios::binary).write((const char*)dataPtr, size);
        }
        ola.FreeImage(imgPtr);
    }
}

原生 DLL 调用

cpp
#include <fstream>
#include <vector>

long instance = CreateCOLAPlugInterFace();
int width = 800, height = 600, stride = width * 3;

std::ifstream ifs("images/frame.rgb", std::ios::binary);
std::vector<unsigned char> rgb(stride * height);
ifs.read((char*)rgb.data(), rgb.size());

long imgPtr = LoadImageFromRGBData(instance, width, height, (long)rgb.data(), stride);
if (imgPtr != 0) {
    long dataPtr = 0; int size = 0, outStride = 0;
    GetImageData(instance, imgPtr, &dataPtr, &size, &outStride);
    WriteBytesToFile(instance, "output/frame.bgra", dataPtr, size);
    FreeImagePtr(instance, imgPtr);
}
csharp
int width = 800, height = 600, stride = width * 3;
byte[] rgb = File.ReadAllBytes(@"images\frame.rgb");
GCHandle pin = GCHandle.Alloc(rgb, GCHandleType.Pinned);
try {
    long imgPtr = LoadImageFromRGBData(instance, width, height, pin.AddrOfPinnedObject().ToInt64(), stride);
    // GetImageData → Marshal.Copy → File.WriteAllBytes → FreeImagePtr
} finally { pin.Free(); }
python
width, height, stride = 800, 600, 800 * 3
with open("images/frame.rgb", "rb") as f:
    rgb = f.read()
buf = create_string_buffer(rgb, len(rgb))
img_ptr = ola.LoadImageFromRGBData(instance, width, height, addressof(buf), stride)
# GetImageData → bytes.from_address → open().write → FreeImagePtr

返回值

返回值说明
非 0成功,返回 OLAImage 对象的地址。
0失败。

注意事项

项目说明
像素格式输入为 24 位 RGB(每像素 3 字节,顺序 R-G-B),不是 BGRA。
stride每行字节数,无行对齐要求时 stride = width * 3;若源缓冲有 padding 则传实际行跨度。
磁盘文件标准 BMP/PNG/JPG 请用 LoadImageLoadImageFromBmpData;本接口适合 裸 RGB 帧、采集卡缓冲
释放OLAImage 句柄须 FreeImagePtr
各语言 I/O读盘优先用语言原生字节数组(C++ ifstreamFile.ReadAllBytesopen().read()、易语言 读入文件 等);写盘先拷贝到原生缓冲再落盘;BMP 文件不涉及 stride
生命周期传入的 rgbdataLoadImageFromRGBData 返回前须保持有效;载入成功后插件已拷贝,可释放源缓冲。