C++如何保存bmp图片
作者:老光私享
这篇文章主要介绍了C++如何保存bmp图片问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
C++保存bmp图片
在 C 语言中,你可以使用 Windows 图像处理库(Windows GDI)来保存 BMP 图片。
你需要使用到两个重要的函数:CreateBitmap 和 SaveBitmap。
CreateBitmap函数用来创建一个位图对象,你需要指定宽度、高度和色彩深度。SaveBitmap函数用来保存位图到一个文件中,你需要指定文件名和位图对象。
下面是一个简单的例子,展示了如何使用这两个函数来保存一个 BMP 图片:
#include <windows.h>
int main()
{
// 创建一个 200x200 像素的位图,色彩深度为 24
HBITMAP hBitmap = CreateBitmap(200, 200, 24);
// 保存位图到文件 "image.bmp"
SaveBitmap(hBitmap, "image.bmp");
return 0;
}请注意,这个例子仅仅是一个示例,实际的图像处理工作可能要更加复杂。
你可能需要使用其他的函数来设置图像像素的值,比如 SetPixel 或者 BitBlt。
C++保存不同的图片格式
保存为BMP格式
//----------------------------------------------------------------------------------
/**
\brief 将m_pBufferRGB图像数据保存成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 = "";
//创建保存图像的文件夹
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; //文件大小
//创建文件
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);
//创建保存图像的文件夹
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);
// 创建文件
HANDLE hFile = ::CreateFile(strFileName,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE) // 创建失败则返回
{
return;
}
else // 保存Raw图像
{
::WriteFile(hFile, pRawBuf, dwImageSize, &dwBytesRead, NULL);
CloseHandle(hFile);
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
