跳到内容
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 插件商店
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 插件商店
申请试用
  • 企业自动化
    • Compressor
  • 福昕CloudAPI
  • 福昕PDF SDK 软件开发工具包
    • 福昕PDF SDK(ActiveX)
    • 福昕PDF SDK(桌面/服务器)
    • 福昕PDF SDK(Plug-in)
    • 福昕 PDF SDK(安卓)
    • 福昕PDF SDK(iOS)
    • 福昕PDF SDK(Web)
  • 福昕管理控制台
    • 公有云
    • 私有云
    • 通用情况
  • 福昕阅读器
    • RMS插件
  • 福昕高级编辑器
    • AI助手
    • Mac版本
      • 常规问题
    • Windows版本
      • ECM集成
      • 互联PDF
      • 企业管理指南
      • 保护
      • 内容编辑
      • 创建PDF
      • 压缩
      • 图章
      • 安装与卸载
      • 常见问题
      • 打印
      • 注释/评论
      • 福昕插件
      • 翻译助手
      • 翻译助手教程
      • 试用与激活
      • 转换
      • 页面管理
    • 教育用户
      • 论文查重
      • 论文畅
      • 操作指南
    • 网页版
      • Foxit eSign
      • 电子签章
    • 订阅
    • 资源
  • 福昕高级编辑器Linux版本
  • 福船图纸管理系统
  • 福昕PDF SDK 软件开发工具包 > 福昕PDF SDK(桌面/服务器)
  • 标签:
  • Bitmap,mat类,opencv,图像,渲染

Bitmap 类如何与opencv的Mat类互转?

  • 福昕知识库
  • 2025-12-31

当业务场景需要将 PDF 文件渲染为位图,并基于该位图开展图像处理(如裁剪、滤波)或图像识别(如 OCR、目标检测)等后续操作时,通常需要将 Foxit PDF SDK 自带的Bitmap类型,转换为常用图像类库的位图格式(以主流的 OpenCV Mat类为例),以此降低跨库开发的适配成本,便捷对接后续业务流程。

以下是 Foxit PDF SDK Bitmap 与 OpenCV Mat 双向互转的完整示例(java版本):


    private static Bitmap Mat2Bitmap(Mat mat) throws PDFException {
        if (mat.empty()) {
            throw new RuntimeException("Mat is empty");
        }

        int width = mat.cols();
        int height = mat.rows();
        int channels = mat.channels();

        Mat convertedMat = new Mat();
        if (channels == 3) {
            // OpenCV 默认是 BGR,转回 RGB
            Imgproc.cvtColor(mat, convertedMat, Imgproc.COLOR_BGR2RGB);
        } else if (channels == 4) {
            // OpenCV 是 BGRA,转回 RGBA
            Imgproc.cvtColor(mat, convertedMat, Imgproc.COLOR_BGRA2RGBA);
        } else if (channels == 1) {
            // 灰度图无需转换
            convertedMat = mat.clone();
        } else {
            //不支持的通道数
            throw new RuntimeException("Unsupported channels: " + channels);
        }
        int bpp = channels * 8; // 每个像素的位数
        int rowValidBytes = width * channels; // 每行有效像素字节数(无填充)
        int pitch = rowValidBytes;

        int bufferSize = pitch * height;
        byte[] buffer = new byte[bufferSize];
        for (int row = 0; row < height; row++) {
            byte[] rowData = new byte[rowValidBytes];
            convertedMat.get(row, 0, rowData);

            // 复制到缓冲区的对应行(包含填充字节)
            int bufferRowStart = row * pitch;
            System.arraycopy(rowData, 0, buffer, bufferRowStart, rowValidBytes);
        }
       Bitmap bitmap = new Bitmap(width, height, e_DIBArgb, buffer,pitch);// pitch, buffer);
        convertedMat.release();
        return bitmap;
    }

    public static Mat bitmapToMat(Bitmap bitmap) throws PDFException {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int bpp = bitmap.getBpp();
        int pitch = bitmap.getPitch();
        byte[] buffer = bitmap.getBuffer();

        if (buffer == null) {
            throw new RuntimeException("Bitmap buffer is null");
        }

        int matType;
        int channels;
        if (bpp == 8) {
            matType = CvType.CV_8UC1;
            channels = 1;
        } else if (bpp == 24) {
            matType = CvType.CV_8UC3;
            channels = 3;
        } else if (bpp == 32) {
            matType = CvType.CV_8UC4;
            channels = 4;
        } else {
            throw new RuntimeException("Unsupported BPP: " + bpp);
        }

        Mat mat = new Mat(height, width, matType);
        int rowValidBytes = width * channels;

        for (int row = 0; row < height; row++) {
            int bufferRowStart = row * pitch;
            byte[] rowData = new byte[rowValidBytes];
            System.arraycopy(buffer, bufferRowStart, rowData, 0, rowValidBytes);

            mat.put(row, 0, rowData);
        }

        if (bpp == 24) {
            Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2BGR);
        } else if (bpp == 32) {
            Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGBA2BGRA);
        }

        return mat.clone();
    }

相关内容

打印管理PrintManager怎么判断文档打印是否完成?

软件如何打开嵌入在office文档中Adobe PDF图标

福昕高级PDF编辑器专业版如何在文档中嵌入一个3D模型

福昕高级PDF编辑器专业版如何实现对图片和文档内容添加马赛克

福昕高级PDF编辑器如何显示注释内容图标

福昕高级PDF编辑器如何添加和调整快速访问工具栏功能

如何在右侧边栏中增加一个自定义的Tab标签页,并可以动态控制其出现的时机?

如何动态显示或隐藏指定组件?

如何将多个表单PDF填充数据后合并为一个PDF文件?

如何向PDF中添加并签署骑缝章?

推荐内容

Bitmap 类如何与opencv的Mat类互转?

打印管理PrintManager怎么判断文档打印是否完成?

软件如何打开嵌入在office文档中Adobe PDF图标

福昕高级PDF编辑器专业版如何在文档中嵌入一个3D模型

福昕高级PDF编辑器专业版如何实现对图片和文档内容添加马赛克

福昕高级PDF编辑器如何显示注释内容图标

福昕高级PDF编辑器如何添加和调整快速访问工具栏功能

如何在右侧边栏中增加一个自定义的Tab标签页,并可以动态控制其出现的时机?

如何动态显示或隐藏指定组件?

如何将多个表单PDF填充数据后合并为一个PDF文件?

产品
  • 应用行业
  • 白皮书
开发支持
  • 开发中心
  • SDK文档资料

销售咨询:010-50951668

客服电话:0591-38509808

销售咨询
微信公众号

©2025 福建福昕软件开发股份有限公司 版权所有

隐私策略