主题
加载图片 - LoadImageFromRGBData
函数简介
从RGB数据加载图片到内存,适用于采集卡或其他RGB数据源。
接口名称
LoadImageFromRGBDataDLL调用
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文件 不含宽高头,width、height须由采集卡分辨率、帧协议或业务配置给出;stride为每行字节数,无行对齐时stride = width × 3(24 位 RGB)。标准 BMP/PNG/JPG 请直接用 LoadImage 或 LoadImageFromBmpData。
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 Iftext
.局部变量 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 请用 LoadImage 或 LoadImageFromBmpData;本接口适合 裸 RGB 帧、采集卡缓冲。 |
| 释放 | OLAImage 句柄须 FreeImagePtr。 |
| 各语言 I/O | 读盘优先用语言原生字节数组(C++ ifstream、File.ReadAllBytes、open().read()、易语言 读入文件 等);写盘先拷贝到原生缓冲再落盘;BMP 文件不涉及 stride。 |
| 生命周期 | 传入的 rgbdata 在 LoadImageFromRGBData 返回前须保持有效;载入成功后插件已拷贝,可释放源缓冲。 |
