• 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;
    }
  • 相关阅读:
    TestNG DataProvider的几种方法写法
    ruby操作EXCEL的简单示例
    QTP的tsr对象库文件转换成XML
    Ruby对时间的处理
    java读取YAML文件
    ruby遍历文件夹
    ruby操作excel文件
    [转载]利用ruby的Net::HTTP发起http请求并对返回包进行简单的校验
    QTP连接MySQL (转载)
    Ruby 冒泡排序
  • 原文地址:https://www.cnblogs.com/nanfei/p/14271474.html
Copyright © 2020-2023  润新知