opencv 图像格式转换

复制代码
extern "C" _declspec(dllexport) BYTE* __stdcall ImageConvert(BYTE* imageData, int imageDataSize, const char* format, int* returnSize)
{
    vector<uchar> data;
    for (int i = 0; i < imageDataSize; ++i) {
        data.push_back(imageData[i]);
    }

    cv::Mat image = cv::imdecode(data, CV_LOAD_IMAGE_COLOR);
    std::vector<uchar> buf;
    imencode(format, image, buf);

    *returnSize = buf.size();
    BYTE* result = new BYTE[*returnSize];
    for (int i = 0; i < *returnSize; i++)
        result[i] = buf[i];
    return result;
}
复制代码

 JAVA调用代码:

复制代码
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

public class Program {
    
    public interface Lib extends Library
    {
        public Pointer ImageConvert(Pointer data, int dataSize, String format , Pointer resultSize);
    }
    
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws IOException {
        Lib lib = (Lib) Native.loadLibrary("..\\OpenCVDemo.dll", Lib.class);
        byte[] data = Files.readAllBytes(Paths.get("..\\01.tif"));
        Pointer ptr = new Memory(data.length);
        ptr.write(0, data, 0, data.length);
        Pointer returnSize = new Memory(4);
        Pointer result = lib.ImageConvert(ptr, data.length, ".png" , returnSize);
        byte[] resultData = result.getByteArray(0, returnSize.getInt(0));
        Files.write(Paths.get("..\\01.png"), resultData);
        System.out.println("ok");
    }

}
复制代码

追加:

下面这个可能更高效:

复制代码
extern "C" _declspec(dllexport) BYTE* __stdcall ImageConvert(BYTE* imageData, int imageDataSize, const char* format, int* returnSize)
{
    //convert byte[] to vector<uchar>
    std::vector<uchar> data(imageData, imageData + imageDataSize);

    //convert image format
    cv::Mat image = cv::imdecode(data, CV_LOAD_IMAGE_COLOR);
    std::vector<uchar> buf;
    imencode(format, image, buf);

    //covert vector<uchar> to byte[]
    *returnSize = buf.size();
    BYTE* result = new BYTE[*returnSize];
    std::copy(buf.begin(), buf.end(), result);

    return result;
}
复制代码

 

posted on   空明流光  阅读(777)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示