C++如何保存bmp圖片
更新時間:2023年08月04日 16:59:33 作者:老光私享
這篇文章主要介紹了C++如何保存bmp圖片問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
C++保存bmp圖片
在 C 語言中,你可以使用 Windows 圖像處理庫(Windows GDI)來保存 BMP 圖片。
你需要使用到兩個重要的函數(shù):CreateBitmap 和 SaveBitmap。
CreateBitmap函數(shù)用來創(chuàng)建一個位圖對象,你需要指定寬度、高度和色彩深度。SaveBitmap函數(shù)用來保存位圖到一個文件中,你需要指定文件名和位圖對象。
下面是一個簡單的例子,展示了如何使用這兩個函數(shù)來保存一個 BMP 圖片:
#include <windows.h>
int main()
{
? ? // 創(chuàng)建一個 200x200 像素的位圖,色彩深度為 24
? ? HBITMAP hBitmap = CreateBitmap(200, 200, 24);
? ? // 保存位圖到文件 "image.bmp"
? ? SaveBitmap(hBitmap, "image.bmp");
? ? return 0;
}請注意,這個例子僅僅是一個示例,實際的圖像處理工作可能要更加復雜。
你可能需要使用其他的函數(shù)來設(shè)置圖像像素的值,比如 SetPixel 或者 BitBlt。
C++保存不同的圖片格式
保存為BMP格式
//----------------------------------------------------------------------------------
/**
\brief 將m_pBufferRGB圖像數(shù)據(jù)保存成BMP圖片
\return 無
*/
//----------------------------------------------------------------------------------
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);
}
// 獲取當前時間為圖像保存的默認名稱
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 相機保存Raw圖像
\param pRawBuf Raw圖像
\param nImageSize 圖像大小
\param srtSavePath 圖像存儲路徑
\return void
*/
//----------------------------------------------------------------------------------
void CFIRADlg::SaveRawImage(BYTE* pRawBuf, int nImageSize, CString srtSavePath)
{
if ((pRawBuf == NULL) || (srtSavePath == ""))
{
return;
}
CString strFileName = ""; // 圖像存儲路徑
DWORD dwImageSize = nImageSize; // 寫入文件的長度
DWORD dwBytesRead = 0; // 文件讀取的長度
// 獲取當前時間
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
//創(chuàng)建保存圖像的文件夾
BOOL bRet = ::CreateDirectory(srtSavePath, NULL);
if (bRet)
{
::SetFileAttributes(srtSavePath, FILE_ATTRIBUTE_NORMAL);
}
// 獲取當前時間為圖像保存的默認名稱
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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++引用、內(nèi)聯(lián)函數(shù)與nullptr超全解析(新手避坑指南)
這篇文章主要介紹了C++引用、內(nèi)聯(lián)函數(shù)與nullptr的相關(guān)資料,引用提供別名,簡化代碼和提高性能,內(nèi)聯(lián)函數(shù)通過減少棧幀開銷優(yōu)化性能,但不能濫用,nullptr替代NULL,提供類型安全的空指針表示,需要的朋友可以參考下2025-12-12
VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序簡明教程
這篇文章主要介紹了VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的方法,結(jié)合實例形式詳細講述了ADO的原理及VC使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06

