C++如何保存bmp圖片
C++保存bmp圖片
在 C 語(yǔ)言中,你可以使用 Windows 圖像處理庫(kù)(Windows GDI)來(lái)保存 BMP 圖片。
你需要使用到兩個(gè)重要的函數(shù):CreateBitmap 和 SaveBitmap。
CreateBitmap
函數(shù)用來(lái)創(chuàng)建一個(gè)位圖對(duì)象,你需要指定寬度、高度和色彩深度。SaveBitmap
函數(shù)用來(lái)保存位圖到一個(gè)文件中,你需要指定文件名和位圖對(duì)象。
下面是一個(gè)簡(jiǎn)單的例子,展示了如何使用這兩個(gè)函數(shù)來(lái)保存一個(gè) BMP 圖片:
#include <windows.h> int main() { ? ? // 創(chuàng)建一個(gè) 200x200 像素的位圖,色彩深度為 24 ? ? HBITMAP hBitmap = CreateBitmap(200, 200, 24); ? ? // 保存位圖到文件 "image.bmp" ? ? SaveBitmap(hBitmap, "image.bmp"); ? ? return 0; }
請(qǐng)注意,這個(gè)例子僅僅是一個(gè)示例,實(shí)際的圖像處理工作可能要更加復(fù)雜。
你可能需要使用其他的函數(shù)來(lái)設(shè)置圖像像素的值,比如 SetPixel 或者 BitBlt。
C++保存不同的圖片格式
保存為BMP格式
//---------------------------------------------------------------------------------- /** \brief 將m_pBufferRGB圖像數(shù)據(jù)保存成BMP圖片 \return 無(wú) */ //---------------------------------------------------------------------------------- void CFIRADlg::SaveImage() { // TODO: Add your control notification handler code here DWORD dwImageSize = (DWORD)(m_nImageWidth * m_nImageHeight * 3); BITMAPFILEHEADER stBfh = { 0 }; DWORD dwBytesRead = 0; SYSTEMTIME sysTime; CString strFileName = ""; //創(chuàng)建保存圖像的文件夾 BOOL bRet = CreateDirectory(m_strFilePath, NULL); if (bRet) { SetFileAttributes(m_strFilePath, FILE_ATTRIBUTE_NORMAL); } // 獲取當(dāng)前時(shí)間為圖像保存的默認(rèn)名稱 GetLocalTime(&sysTime); CString imagename; imagename = _T("%s\\%d_%d_%d_%d_%d_%d_%d.bmp"); strFileName.Format(imagename, m_strFilePath, sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds); stBfh.bfType = (WORD)'M' << 8 | 'B'; //定義文件類型 stBfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //定義文件頭大小彩色 stBfh.bfSize = stBfh.bfOffBits + dwImageSize; //文件大小 //創(chuàng)建文件 HANDLE hFile = ::CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { ::WriteFile(hFile, &stBfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL); ::WriteFile(hFile, m_pBmpInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL); //彩色 ::WriteFile(hFile, m_pBufferRGB, dwImageSize, &dwBytesRead, NULL); CloseHandle(hFile); } }
保存為RAW格式
//--------------------------------------------------------------------------------- /** \brief 相機(jī)保存Raw圖像 \param pRawBuf Raw圖像 \param nImageSize 圖像大小 \param srtSavePath 圖像存儲(chǔ)路徑 \return void */ //---------------------------------------------------------------------------------- void CFIRADlg::SaveRawImage(BYTE* pRawBuf, int nImageSize, CString srtSavePath) { if ((pRawBuf == NULL) || (srtSavePath == "")) { return; } CString strFileName = ""; // 圖像存儲(chǔ)路徑 DWORD dwImageSize = nImageSize; // 寫入文件的長(zhǎng)度 DWORD dwBytesRead = 0; // 文件讀取的長(zhǎng)度 // 獲取當(dāng)前時(shí)間 SYSTEMTIME sysTime; GetLocalTime(&sysTime); //創(chuàng)建保存圖像的文件夾 BOOL bRet = ::CreateDirectory(srtSavePath, NULL); if (bRet) { ::SetFileAttributes(srtSavePath, FILE_ATTRIBUTE_NORMAL); } // 獲取當(dāng)前時(shí)間為圖像保存的默認(rèn)名稱 strFileName.Format("%s\\%d_%d_%d_%d_%d_%d_%d.raw", srtSavePath, sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds); // 創(chuàng)建文件 HANDLE hFile = ::CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) // 創(chuàng)建失敗則返回 { return; } else // 保存Raw圖像 { ::WriteFile(hFile, pRawBuf, dwImageSize, &dwBytesRead, NULL); CloseHandle(hFile); } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Matlab實(shí)現(xiàn)數(shù)字音頻分析處理系統(tǒng)
這篇文章主要為大家介紹了如何利用Matlab制作一個(gè)帶GUI的數(shù)字音頻分析與處理系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問(wèn)題解析
fork()函數(shù)在Linux下可以用于產(chǎn)生一個(gè)子進(jìn)程,這里我們挑選了兩個(gè)fork相關(guān)的面試題,來(lái)看一下Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問(wèn)題解析2016-06-06C++使用OpenCV進(jìn)行物體識(shí)別與檢測(cè)的三種方法
物體識(shí)別與檢測(cè)是計(jì)算機(jī)視覺(jué)中的核心任務(wù)之一,它被廣泛應(yīng)用于自動(dòng)駕駛、安防監(jiān)控、圖像分析等領(lǐng)域,通過(guò)物體檢測(cè)技術(shù),計(jì)算機(jī)能夠從圖像中識(shí)別出特定的物體或目標(biāo),本文將介紹如何使用 C++ 和 OpenCV 庫(kù)進(jìn)行物體識(shí)別與檢測(cè),需要的朋友可以參考下2025-04-04VC自定義消息響應(yīng)函數(shù)postmessage用法示例
這篇文章主要介紹了VC自定義消息響應(yīng)函數(shù)postmessage用法示例,并對(duì)比說(shuō)明了postmessage與sendmessage的用法區(qū)別,需要的朋友可以參考下2014-10-10C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)實(shí)戰(zhàn)教學(xué)
在本篇文章里小編給大家分享了關(guān)于C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)實(shí)戰(zhàn)教學(xué)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2019-01-01