使用C++將處理后的信號(hào)保存為PNG和TIFF格式
1. PNG格式保存
使用stb_image_write庫(kù)
stb_image_write是一個(gè)單文件、輕量級(jí)的庫(kù),能夠讓你方便地將圖像保存為PNG格式。它的優(yōu)點(diǎn)在于簡(jiǎn)單且無(wú)外部依賴,非常適合用來(lái)進(jìn)行快速的圖像保存。
1.1 安裝和包含庫(kù)
為了使用stb_image_write,首先需要下載stb庫(kù)并包含stb_image_write.h頭文件。你可以在下面找到需要使用庫(kù)。
stb_image安裝及使用
環(huán)境:win7 VS2015
1. 下載stb_image :
github地址:https://github.com/nothings/stb
2. opengl項(xiàng)目配置:
因?yàn)閟tb_image庫(kù)實(shí)現(xiàn)都寫(xiě)在頭文件中,不需要編譯成庫(kù),項(xiàng)目中直接引用頭文件目錄即可。
a. 項(xiàng)目屬性 ----> C/C++ —> 附加包含目錄 —> your_path\stb-master
3. 代碼:
該程序主要實(shí)現(xiàn)了加載圖片,修改圖片寬高并導(dǎo)出。
#include <iostream> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" #define STB_IMAGE_RESIZE_IMPLEMENTATION #include "stb_image_resize.h" #include <string> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; int main() { std::cout << "Hello, STB_Image" << std::endl; string inputPath = "../res/11.jpg"; int iw, ih, n; // 加載圖片獲取寬、高、顏色通道信息 unsigned char *idata = stbi_load(inputPath.c_str(), &iw, &ih, &n, 0); int ow = iw / 2; int oh = ih / 2; auto *odata = (unsigned char *)malloc(ow * oh * n); // 改變圖片尺寸 stbir_resize(idata, iw, ih, 0, odata, ow, oh, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0, STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP, STBIR_FILTER_BOX, STBIR_FILTER_BOX, STBIR_COLORSPACE_SRGB, nullptr ); string outputPath = "../res/11out.jpg"; // 寫(xiě)入圖片 stbi_write_png(outputPath.c_str(), ow, oh, n, odata, 0); stbi_image_free(idata); stbi_image_free(odata); return 0; }
【注意】建議將這些單獨(dú)寫(xiě)在一個(gè).cpp文件否則會(huì)報(bào)一堆錯(cuò)誤:
#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h"
1.2 代碼解析
以下是如何將信號(hào)保存為PNG文件的過(guò)程:
- 獲取當(dāng)前目錄路徑:首先,通過(guò)
QDir
和QFileInfo
獲取當(dāng)前工作目錄的路徑。 - 幅值計(jì)算與歸一化:對(duì)于每個(gè)像素點(diǎn),計(jì)算其幅值(復(fù)數(shù)的模),然后進(jìn)行歸一化。歸一化的目的是將信號(hào)的幅值映射到圖像格式所要求的范圍內(nèi)。
- 保存為PNG:最后,使用
stbi_write_png
函數(shù)將數(shù)據(jù)保存為PNG文件。
if (stbi_write_png(write_to_Path, Nr, Na, 1, data_w, Nr * sizeof(unsigned short))) { cout << "灰度圖像保存成功: " << write_to_Path << endl; } else { cout << "灰度圖像保存失敗" << endl; }
在這段代碼中,write_to_Path
是保存PNG圖像的路徑,Nr
和Na
分別是圖像的行數(shù)和列數(shù),data_w
是處理后的信號(hào)數(shù)據(jù)。
下面講的opencv也可以保存png這種格式。
2. TIFF格式保存
使用OpenCV庫(kù)
OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),廣泛用于圖像處理、計(jì)算機(jī)視覺(jué)以及機(jī)器學(xué)習(xí)任務(wù)。OpenCV不僅支持圖像讀取、處理,還支持將處理結(jié)果保存為多種格式,包括TIFF。
2.1 安裝OpenCV
在Windows或其他操作系統(tǒng)上,可以參考下面這個(gè)教程進(jìn)行安裝配置。
Windows上Qt配置OpenCV的詳細(xì)教程(避坑必看)_C 語(yǔ)言_腳本之家
2.2 代碼解析
與PNG保存類似,保存為TIFF的過(guò)程也需要計(jì)算幅值并進(jìn)行歸一化。不同的是,這里使用的是OpenCV的cv::Mat
類來(lái)處理圖像數(shù)據(jù)。
- 創(chuàng)建
cv::Mat
對(duì)象:將處理后的信號(hào)數(shù)據(jù)封裝成一個(gè)OpenCV矩陣對(duì)象cv::Mat
。cv::Mat
是OpenCV中最常用的圖像數(shù)據(jù)結(jié)構(gòu),它支持多種數(shù)據(jù)類型,并且能夠高效地進(jìn)行圖像操作。 - 設(shè)置TIFF保存參數(shù):使用
std::vector<int>
來(lái)設(shè)置TIFF圖像的壓縮方式。TIFF格式支持多種壓縮方式,代碼中使用了無(wú)壓縮方式。 - 保存為TIFF:使用OpenCV的
cv::imwrite
函數(shù)將圖像數(shù)據(jù)保存為TIFF文件。
std::vector<int> compression_params; compression_params.push_back(cv::IMWRITE_TIFF_COMPRESSION); compression_params.push_back(1); // 無(wú)壓縮 bool result = cv::imwrite(write_to_Path, image); if (result) { cout << "TIFF圖像保存成功: " << write_to_Path << std::endl; } else { cout << "TIFF圖像保存失敗" << std::endl; }
以上就是使用C++將處理后的信號(hào)保存為PNG和TIFF格式的詳細(xì)內(nèi)容,更多關(guān)于C++信號(hào)保存為PNG和TIFF格式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言中((type *)0) 和(type *0)區(qū)別小結(jié)
((type *)0)?和?(type *0)?在 C 和 C++ 中有不同的含義和用途,本文主要介紹了C語(yǔ)言中((type *)0) 和(type *0)區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08C/C++中時(shí)間庫(kù)函數(shù)的使用詳解
這篇文章主要為大家詳細(xì)介紹了C/C++中的時(shí)間相關(guān)知識(shí)總結(jié),例如時(shí)間庫(kù)函數(shù)的使用以及獲取本地時(shí)間的不同方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-11-11Matlab實(shí)現(xiàn)多子圖同步調(diào)整視角
這篇文章主要為大家介紹了如何利用Matlab實(shí)現(xiàn)多子圖同步調(diào)整視角,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03C++數(shù)據(jù)結(jié)構(gòu)模板進(jìn)階的多方面分析
今天我要給大家介紹C++中的模板更深的一些知識(shí)。有關(guān)于非類型的模板參數(shù)和模板特化的一些知識(shí),感興趣的朋友快來(lái)看看吧2022-02-02如何用C++實(shí)現(xiàn)雙向循環(huán)鏈表
本篇文章是對(duì)用C++實(shí)現(xiàn)雙向循環(huán)鏈表的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05解析C/C++?Capstone?引擎源碼編譯問(wèn)題
Capstone的編譯非常簡(jiǎn)單只需要一步即可輕松得到對(duì)應(yīng)的Lib庫(kù)文件,如下將介紹該引擎如何被編譯,以及簡(jiǎn)單的測(cè)試編譯,這篇文章主要介紹了C/C++?Capstone?引擎源碼編譯,需要的朋友可以參考下2022-09-09