在Vitis?IDE中如何使用第三方庫?libtiff?保存?tiff?文件
目的和思路
一個Vitis IDE 裸機(jī)項目,需要將視頻幀無損地保存下來
由于每幀的像素數(shù)據(jù)是 16bit 1通道的 bayer 格式,滿足這一需求的圖像格式似乎只有 tiff 格式開源的tiff 庫是 libtiff,而在 Vitis IDE 裸機(jī)項目中要使用的話就需要交叉編譯Vitis IDE 裸機(jī)的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 進(jìn)行測試 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浮點運(yùn)算,所以在 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++ 虛函數(shù)與純虛函數(shù)的區(qū)別(深入分析)
本篇文章是對c++中虛函數(shù)與純虛函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Linux網(wǎng)絡(luò)編程之socket文件傳輸示例
這篇文章主要介紹了Linux網(wǎng)絡(luò)編程之socket文件傳輸示例,對于基于Linux平臺的C程序員來說有一定的借鑒價值,需要的朋友可以參考下2014-08-08