在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件

2023-11-04

目的和思路

一个Vitis IDE 裸机项目,需要将视频帧无损地保存下来

由于每帧的像素数据是 16bit 1通道的 bayer 格式,满足这一需求的图像格式似乎只有 tiff 格式
开源的tiff 库是 libtiff,而在 Vitis IDE 裸机项目中要使用的话就需要交叉编译
Vitis IDE 裸机的cpu是arm v7 cortex a9,用到的编译器是 arm-none-eabi
在Ubuntu中利用 对应版本的 petalinux 自带的 arm-none-eabi 编译器编译libtiff
最后Vitis IDE中添加并使用编译好的第三方库 libtiff 就能保存 tiff 文件了

libtiff 交叉编译

下载源码,解压到ubuntu
配置Makefile命令 ./configure --prefix=/home/hammer/tiff-4.5.0/install --host=arm-none-eabi CFLAGS="-fno-exceptions --specs=nosys.specs -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard"
然后 make & make install

编译好之后的结果,移到windows中
在这里插入图片描述

在Vitis IDE中添加libtiff并编译

打开IDE,新建一个application,右击properties

在这里插入图片描述

gcc compiler 配置 Include,path 添加编译好的 include 路径

在这里插入图片描述
gcc linker 配置 Libraries,path 添加 tiff 的 lib 库,-l 添加 tiffm

在这里插入图片描述

在这里插入图片描述

编写一个 main.c 进行测试 libtiff 库函数是否能用

#include <stdio.h>
#include <stdlib.h>
#include <tiffio.h>

#define WIDTH 640
#define HEIGHT 480
#define BITS_PER_SAMPLE 8
#define SAMPLES_PER_PIXEL 1

int main() {
    // 假设帧缓存是一个二维数组,存储了像素数据
    // 这里使用动态分配内存来模拟帧缓存
    unsigned char** frameBuffer = (unsigned char**)malloc(HEIGHT * sizeof(unsigned char*));
    for (int i = 0; i < HEIGHT; i++) {
        frameBuffer[i] = (unsigned char*)malloc(WIDTH * sizeof(unsigned char));
    }

    // 假设帧缓存已经填充了像素数据
    // 这里仅为示例,使用简单的灰度图像
    for (int y = 0; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            frameBuffer[y][x] = (unsigned char)(x % 256);
        }
    }

    // 创建 TIFF 文件指针
    TIFF* tiff = TIFFOpen("frame.tiff", "w");

    if (tiff == NULL) {
        printf("无法创建 TIFF 文件\n");
        return 1;
    }

    // 设置 TIFF 参数
    TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, WIDTH);
    TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, HEIGHT);
    TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, BITS_PER_SAMPLE);
    TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, SAMPLES_PER_PIXEL);
    TIFFSetField(tiff, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
    TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
    TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, 1);

    // 逐行写入像素数据
    for (int y = 0; y < HEIGHT; y++) {
        if (TIFFWriteScanline(tiff, frameBuffer[y], y, 0) < 0) {
            printf("写入 TIFF 文件失败\n");
            TIFFClose(tiff);
            return 1;
        }
    }

    // 关闭 TIFF 文件
    TIFFClose(tiff);

    // 释放帧缓存内存
    for (int i = 0; i < HEIGHT; i++) {
        free(frameBuffer[i]);
    }
    free(frameBuffer);

    printf("帧缓存已保存为 frame.tiff\n");

    return 0;
}

其实编译成功就说明可以了

在这里插入图片描述

遇到的问题

直接 ./configure --prefix=/home/hammer/tiff-4.5.0/install --host=arm-none-eabi 会报错

报错1:libc.a undefined reference to _exit

stack overflow 社区有相关讨论 Makefile linking: undefined reference to _exit
根据讨论结果,在 CFLAGS 中加上 -fno-exceptions --specs=nosys.specs 即可

报错2:tiff_app.elf uses VFP register arguments, libtiff.a(tif_close.o) does not

说明编译的 libtiff.a 不带VFP浮点运算,所以在 CFLAGS 中要加上

 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard

报错3:\libtiff.a(tif_aux.o): in function TIFFDefaultTransferFunction: tif_aux.c:(.text+0x5e4): undefined reference to `pow’

在C语言中,pow函数是位于数学库中的一个标准函数,说明缺少对数学库的链接
所以在 Libraries 部分,添加链接标志 -lm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件 的相关文章

  • 纯 Web 应用程序(HTML5 等)的推荐 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Ubuntu18 上打开 Spyder3 时缺少依赖项导致密钥环错误?

    我对编程之类的东西相当陌生 我正在尝试使用 Spyder3 但不断收到此错误 如下 我使用的是Geforce 1080ti Ubuntu 18 04 01 python3 3 6 python2没有安装 我尝试了 pip3 install
  • Lighttable,设置字体大小

    我是 Light Table IDEAS 的新手 有谁知道如何设置workspace和 Windows 字体大小 我可以更改编辑器字体大小 但不知道如何设置font size对于其他元素 或者更改所有 IDE 字体的全局字体大小 打开命令窗
  • Eclipse 中是否有键盘快捷键可以折叠当前方法/块?

    问题说明了一切 我在 Eclipse v3 4 中打开了折叠功能 并且不必单击页面装订线中的小 我想知道是否有一个键盘快捷键 折叠当前方法 快速浏览一下 Eclipse 中的菜单和其他内容不会显示它的菜单项 所以也许您无法做到这一点 Any
  • 在 Codeblocks 中启用编译器输出窗格

    This is probably a really noob question but the fact of the matter is that my Code blocks wouldn t show me errors when i
  • IntelliJ Idea 15 显示依赖包和项目包

    IntelliJ Idea 15 CE 在项目的包视图中显示来自库 依赖项的包 仅当项目的根包与某些依赖项的根包相同时才会发生这种情况 对于前 我的项目的根包是org 所以所有的依赖关系也有org包状org apache logging也被
  • 如何设置 Xcode 来代替 Qt Creator 工作?

    我不使用 Qt Creator 的 UI 设计功能 对于一个新项目 我想体验一下使用 Xcode 的工作 这将是一个常规的 Qt 项目 使用 C 和 Qt 库开发 就像在 Qt Creator 中一样 我没有使用 OS X 尤其是 Xcod
  • Kendo 有 GUI 设计师吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Kendo 有没有像 Sencha Architect for Ext JS 这样的控件布局设计工具
  • 防止 Visual Studio Code 或 IDE 泄露 Python 类私有方法

    只是想问一个简单的问题 本质上 我想知道是否可以从 Visual Studio Code 或其他 IDE 提供的建议列表中隐藏 Python 类私有方法 例如 假设我们有一个类 A Creating a class class A Decl
  • vs2008中的线程窗口在哪里

    我试图在 VS 2008 中找到描述的线程窗口here http www wintellect com cs blogs jrobbins archive 2007 08 01 neat new multithreaded debuggin
  • 如何在 Windows 上的 Eclipse 中设置 Clang 工具链?

    我为一个愚蠢的问题道歉 但我在网上找不到答案 我正在努力为 64 位计算机上的 Windows 7 中的 Eclipse 设置 Clang 编译器 链接器 我对 C 的了解非常过时 并且从未在 Eclipse 中工作过 我想要实现的是在 W
  • 如何禁用 Qt Creator 中的“问题”窗格?

    我发现使用编译器输出更容易 但 Qt Creator 中的 问题 窗格会在每次编译后自动弹出 隐藏有用的信息 迫使我每次都隐藏它 有没有办法禁用这种行为 我不介意收集错误 我只是不希望每次我不要求时都显示这个特定的 UI 我使用的是 Qt
  • Linux 中的 R 有哪些可用的 IDE? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Linux 中的 R 有哪些好的 IDE 我尝试过 Rcmdr 和 Eclipse 但似乎都不具有与 Windows 中的 Tinn R
  • 如何使用 ClangCodeModel 插件在 QtCreator 中设置 C++ 标准?

    抱歉 如果这是一个愚蠢的问题 但我已经尝试了几乎所有的方法 现在正在用头撞墙 问题是 带有 Clang 代码模型插件的 QtCreator 4 8 0 beta for Windows 解析我的项目 为 C 98 而实际上它是 C 17 但
  • Ruby On Rails 与 Windows Vista - 最佳设置? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您认为 Win Vista 环境中 RoR 的最佳设置是什么 我尝试过 radrails eclipse 插件 它对我来说似乎太庞大了 我也开始
  • Eclipse:对 Java 1.7 的失望(未绑定库)

    我在全新安装的 Eclipse 中处理全新项目时遇到问题 重现步骤 下载此版本的 Eclipse http www eclipse org downloads packages eclipse ide java developers hel
  • IntelliJ IDEA - 分离编辑器窗口

    我最近从我的 IntelliJ 设置中删除了选项卡 因为有了可用于在文件之间导航的所有功能 谁需要它们 问题是 分离编辑器窗口的正常方法是将选项卡拖动到另一个屏幕 或区域 上 键映射中似乎没有任何用于分离编辑器窗口的内容 有没有办法通过键盘
  • 在硬件不足的情况下进行编码

    我目前正在使用 C 中的 SIMD 指令进行编码 并尝试使用 IDE 在实时编码时显示错误 拼写错误等 问题是 我使用的是 AVX512 指令 我的硬件不支持这些指令 只有我用于编译的服务器支持 有没有一种方法可以在 IDE 中进行错误检查
  • 如何折叠 C# 中的所有 #region 和方法?

    全部一一崩掉真是太烦人了 Like Steve said CTRL M plus CTRL L for collapsing all regions recursively This one is a toggle meaning you
  • IntelliJ 11.1.3 中的“应用程序服务器”选项卡在哪里

    与以前的版本一样 在 IDE 设置中找不到应用程序服务器选项卡 我正在使用 11 1 3 Ultimate 它就在那里 也许你缺少一些插件 If you still can t find it hit Ctrl Shift A Enter

随机推荐

  • 联想小新air14安装ubuntu16.04

    首先正常安装 会遇到显卡问题 进入ubuntu高级模式 recovery mode resume 然后按照这篇教程整 https blog csdn net Guangli R article details 86636923 utm so
  • PCB设计 接地 铺铜的技巧

    PCB设计 接地 铺铜的技巧 1 PCB设计接地敷铜的技巧 pcb 电工之家 2 覆铜步骤及设计规则 百度文库 3 产品可靠性1 多层电路板应不应该在顶层和底层铺铜 Steven Aileen的博客 CSDN博客 4层板顶底层还用铺铜吗
  • 淘宝、支付宝菜鸟小程序取件码找不到的解决方法

    淘宝 支付宝菜鸟小程序身份码找不到的解决方法 今天拿快递的时候在淘宝里面找身份码 死活找不到 明明之前可以找到的 最后还是下载了菜鸟裹裹app才能取件 上网搜索了一下 发现有的地方很早就把小程序里面的身份码给阉割了 强行让用户下载app实属
  • Evaluate Video Quality

    How to evaluate video PSNR and SSIM PSNR is easy to calculate http blog csdn net c602273091 article details 49861817 SSI
  • 跟着angularjs2官方文档学习(五)

  • 走进 San CLI(下):实现原理

    作者 胡粤 上期我们讨论了 San CLI 的使用 这期我们再深入一点 来看看 San CLI 的实现原理 核心模块和核心概念 为了方便理解下文的 San CLI 的整体工作流程 主流程 我们先来看下 San CLI 的核心模块和核心概念
  • 调试osgEarth(三十四)资源释放器子节点的作用

    感谢 hankern 学习链接https blog csdn net hankern article details 85519058 继续调试 设个断点 开始时没有要释放的资源 看上一层 再上一层 很明显 ResourceReleaser
  • beego禁用3DES和DES弱加密算法--SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】(二)

    目录 程序代码 nmap重新扫描 程序代码 用beego起的一个 https 服务 被扫描出了漏洞 SSL TLS协议信息泄露漏洞 CVE 2016 2183 需要禁用DES加密算法 参考源码 解决方法如下 beego Run 前添加 ci
  • linux基础--基础

    Linux结构目录 Linux 部分目录结构 根目录 只存放目录 不要存放文件 目录 如 etc bin dev lib sbin 等放置在一个分区中 bin 可执行二进制目录文件 如常用的ls cat mv tar 命令存放在本目录中 查
  • github上给自己的项目添加Collaborators

    一个软件项目不可避免的需要与别人合作 如果我们想要参与github上的开源项目 一般的方式是先fork 之后再pull request 但是这种方式如果是自己和别人一起开发的项目就很麻烦 这时我们可以给自己的项目添加Collaborator
  • Logstash安装logstash-integration-jdbc

    Logstash安装logstash integration jdbc 1 版本说明 logstash7 10 1 2 前置条件 logstash integration jdbc是使用ruby语言开发的 因此需安装gem gem是Ruby
  • 【Linux】用户组与文件目录权限

    Linux用户与组 Linux本身是个多用户多任务的操作系统 用户账户分类 root用户 UID 0 超级用户 能跨越一切用户和组群对所有文件或目录进行读取 修改 删除 系统用户 UID 1 999 虚拟用户 不具有登入Linux的能力 是
  • java中Graphics类的使用

    绘图 很多程序如各种小游戏都需要在窗口中绘制各种图形 除此之外 即使在开发JavaEE项目时 有 时候也必须 动态 地向客户 端生成各种图形 图表 比如 图形验证码 统计图等 这都需要利用AWT的绘图功能 组件绘图原理 之前我们已经学习过很
  • xtu oj 1328 数码和

    题目描述 一个10进制数n在2 16进制下可以得到的不同的数码和 求在这些数码和中出现次数最多的数码和 比如20 其中数码和2和4分别出现了3次 为最多出现次数 输入 第一行是一个整数T 1 T 1000 表示样例的个数 以后每行一个整数n
  • 企业研发提效抓手,揭秘云原生的效能“奇点”

    导语 在云原生时代 研发效能治理面临新的挑战 同时也获得了新的视角 如何更好地利用云原生技术的优势 从而在根本上提升研发效能 已成为许多企业数字化转型过程中的 必答题 今天 我们特别邀请了 Thoughtworks 创新技术总经理 腾讯云
  • linux kernel文件系统数据结构file_system_type

    linux kernel文件系统数据结构file system type 文件系统类型用于表示各种不同的文件系统 如fat sysfs proc等等 对于每个不同的文件系统 都以struct file system type进行描述 内核将
  • 202310读书笔记|《大白鲸原创图画书优秀作品:虾一跳》——蝴蝶效应之最,你值得一读

    202310读书笔记 大白鲸原创图画书优秀作品 虾一跳 蝴蝶效应之最 你值得一读 大白鲸原创图画书优秀作品 虾一跳 作者 耿彦红 文 齐海潮 图 由虾一跳的连锁反应构成了整本书的故事脉络 很生动 故事及叙述的重复都不冗杂 反而很朗朗上口 并
  • 密码学--CTF Crypto 总结

    密码学简介 密码学 Cryptography 一般可分为古典密码学和现代密码学 其中 古典密码学 作为一种实用性艺术存在 其编码和破译通常依赖于设计者和敌手的创造力与技巧 并没有对密码学原件进行清晰的定义 其主要包含以下几个方面 单表替换加
  • TCP与UDP

    前言 TCP和UDP是两个传输层最有代表性的传输层协议 TCP一般提供可靠的信息传输 而UDP常被用于广播和细节控制交给应用的通信传输 传输层的定义 在传输层 IP首部有一个协议字段 用来区分使用的是什么协议 用端口号进行处理的具体程序 在
  • 在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件

    目的和思路 一个Vitis IDE 裸机项目 需要将视频帧无损地保存下来 由于每帧的像素数据是 16bit 1通道的 bayer 格式 满足这一需求的图像格式似乎只有 tiff 格式 开源的tiff 库是 libtiff 而在 Vitis