在Vitis?IDE中如何使用第三方庫?libtiff?保存?tiff?文件
目的和思路
一個Vitis IDE 裸機項目,需要將視頻幀無損地保存下來
由于每幀的像素數(shù)據(jù)是 16bit 1通道的 bayer 格式,滿足這一需求的圖像格式似乎只有 tiff 格式開源的tiff 庫是 libtiff,而在 Vitis IDE 裸機項目中要使用的話就需要交叉編譯Vitis IDE 裸機的cpu是arm v7 cortex a9,用到的編譯器是 arm-none-eabi在Ubuntu中利用 對應(yīng)版本的 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
編譯好之后的結(jié)果,移到windows中

在Vitis IDE中添加libtiff并編譯
打開IDE,新建一個application,右擊properties

gcc compiler 配置 Include,path 添加編譯好的 include 路徑

gcc linker 配置 Libraries,path 添加 tiff 的 lib 庫,-l 添加 tiff 和 m


編寫一個 main.c 進行測試 libtiff 庫函數(shù)是否能用
#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() {
// 假設(shè)幀緩存是一個二維數(shù)組,存儲了像素數(shù)據(jù)
// 這里使用動態(tài)分配內(nèi)存來模擬幀緩存
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));
}
// 假設(shè)幀緩存已經(jīng)填充了像素數(shù)據(jù)
// 這里僅為示例,使用簡單的灰度圖像
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
frameBuffer[y][x] = (unsigned char)(x % 256);
}
}
// 創(chuàng)建 TIFF 文件指針
TIFF* tiff = TIFFOpen("frame.tiff", "w");
if (tiff == NULL) {
printf("無法創(chuàng)建 TIFF 文件\n");
return 1;
}
// 設(shè)置 TIFF 參數(shù)
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);
// 逐行寫入像素數(shù)據(jù)
for (int y = 0; y < HEIGHT; y++) {
if (TIFFWriteScanline(tiff, frameBuffer[y], y, 0) < 0) {
printf("寫入 TIFF 文件失敗\n");
TIFFClose(tiff);
return 1;
}
}
// 關(guān)閉 TIFF 文件
TIFFClose(tiff);
// 釋放幀緩存內(nèi)存
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 社區(qū)有相關(guān)討論 Makefile linking: undefined reference to _exit
根據(jù)討論結(jié)果,在 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函數(shù)是位于數(shù)學(xué)庫中的一個標(biāo)準(zhǔn)函數(shù),說明缺少對數(shù)學(xué)庫的鏈接所以在 Libraries 部分,添加鏈接標(biāo)志 -lm
到此這篇關(guān)于在Vitis IDE中使用第三方庫 libtiff 保存 tiff 文件的文章就介紹到這了,更多相關(guān)Vitis IDE使用 libtiff 保存 tiff 文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實現(xiàn)簡單的學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
詳解設(shè)計模式中的Command命令模式及相關(guān)C++實現(xiàn)
這篇文章主要介紹了詳解設(shè)計模式中的Command命令模式及相關(guān)C++實現(xiàn),命令模式強調(diào)調(diào)用操作的對象和操作的具體實現(xiàn)者之間的解耦,需要的朋友可以參考下2016-03-03
Qt中QSettings配置文件的讀寫和應(yīng)用場景詳解
這篇文章主要給大家介紹了關(guān)于Qt中QSettings配置文件的讀寫和應(yīng)用場景的相關(guān)資料,QSettings能讀寫配置文件,當(dāng)配置文件不存在時,可生成配置文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-10-10
C++實現(xiàn)TCP客戶端及服務(wù)器Recv數(shù)據(jù)篩選處理詳解
這篇文章主要為大家介紹了C++實現(xiàn)TCP客戶端及服務(wù)器Recv數(shù)據(jù)篩選處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
深入學(xué)習(xí)C語言mmap和shm*的使用方法技巧
本文將詳細介紹mmap和shm的工作原理,包括它們在內(nèi)存映射和共享內(nèi)存方面的優(yōu)勢和適用場景,同時,文章還會分享一些使用mmap和shm的技巧和經(jīng)驗,以幫助讀者優(yōu)化并提高程序性能,使你能夠在實際項目中更好地利用這些技術(shù)來加速數(shù)據(jù)共享和多線程應(yīng)用2023-10-10

