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;
    }
  • 相关阅读:
    像画笔一样慢慢画出Path的三种方法(补充第四种)
    占位符行为 PlaceHolderBehavior 的实现以及使用
    WPF实现物理效果 拉一个小球
    WPF实现Twitter按钮效果
    WPF自适应可关闭的TabControl 类似浏览器的标签页
    WPF仿百度Echarts人口迁移图
    WPF绘制简单常用的Path
    51Nod 1534 棋子游戏
    数论基础
    Buy a Ticket
  • 原文地址:https://www.cnblogs.com/nanfei/p/14271474.html
Copyright © 2011-2022 走看看