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

目的和思路

一个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 1int 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26702.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构day3(2023.7.17)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;时间复杂度 时间复杂度&#xff1a;只保留最高阶f(n)3*n^2n^2100nT(n)O(3*n^3n^2100n)O(3*n^3)O(n^3)1>O(1):常数阶int ta; 1ab; 1at; 1f(n)3T(n)O(3)O(3*n^0)O(n^0)O(1)2>O(n): 线性阶for…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准。它的官方客户端提供了多种编程语言的接口&#xff0c;包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

Ubuntu 18.04 Docker 安装配置 Apollo 6.0

百度 Apollo 安装测试&#xff08;1&#xff09; Apollo 6.0 安装完全指南 在这一步出错&#xff1a; 进入到 Apollo 源码根目录&#xff0c;打开终端&#xff0c;执行下述命令以启动 Apollo Docker 开发容器 ./docker/scripts/dev_start.sh并没有成功启动 Apollo docker 开发…

gma 2.0.0a3 (2023.07.17) 更新日志

安装 gma 2.0.0a3 pip install gma2.0.0a3新增 1、为矢量要素&#xff08;Feature&#xff09;添加 【Difference】&#xff08;差集&#xff09;方法   取第一个矢量要素与第二个矢量要素的几何差集。  2、为矢量要素&#xff08;Feature&#xff09;添加几种几何形状测试…

LLaMA(Open and Efficient Foundation Language Models )论文解读(二)

此篇博客主题:LLAMA模型数据、训练时长、功耗及碳排放量 LLaMA: Open and Efficient Foundation Language Models paper https://arxiv.org/pdf/2302.13971v1.pdf 1 训练样本 Overall, our entire training dataset contains roughly 1.4T tokens after tokenization. For mo…

求根节点到叶节点数字之和

给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。…

Ubuntu环境搭建

本文以Ubuntu 18.04为例 安装repo mkdir ~/bin export PATH~/bin:$PATH如果可以访问 google 的地址&#xff0c;下载 Repo 工具&#xff0c;并确保它可执行&#xff1a; curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod ax ~/bin/rep…

left join 和except方法区别和联系

目录 相同点&#xff1a; left join except 不同点 假设有两个表&#xff1a;A客户表 和 B客户表&#xff0c;客户uid是唯一主键 相同点&#xff1a; 查询在A中的客户 但不在B中&#xff0c;也就是图中的阴影部分&#xff0c;left join 和except方法都可以实现 left join …

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

Java 设计模式——装饰者模式

目录 1.概述2.结构3.案例实现3.1.抽象组件3.2.具体组件3.3.抽象装饰3.4.具体装饰3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——BufferedWriter7.装饰者模式和静态代理的比较 1.概述 &#xff08;1&#xff09;我们先来看一个快餐店的例子&#xff1a;快餐店有炒面、炒饭这些…

【DC-DC】AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式,高效率、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&…

怎么自学网络安全?遇到问题该怎么解决?

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…