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); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。