zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    php 上传大文件问题
    两台虚拟机实现负载均衡
    lnmp一键安装包搭建lnmp环境
    PHPExcel在读取时时间的处理
    ZeroMQ研究与应用分析
    堆排序(概念、原理、实现)
    HASH表的实现(拉链法)
    加密和数字签名工具GPG
    我的2014 一言难尽
    MySQL优化之profile
  • 原文地址:https://www.cnblogs.com/nanfei/p/14271474.html
Copyright © 2011-2022 走看看