

码龄10年
暂无认证
34127访问
1
等级
8获赞
3
评论
热门文章
-
一.某岛之人物对象及其加密函数解析
2147
-
一.《传奇M》装备栏遍历的突破口
1789
-
二.某龙端游中LUA的分析和调用
1539
-
一.《轩辕传奇》周围遍历之二叉树
1386
-
一.《UE4奥丁》人物最大属性
1331
最新评论
-
20240228阿⑤
积分乍获得
-
20231124ziher
666
-
20230909八月老师
什麼時候發佈易語言支持庫呢
三.《生成BMP图片》像素数据转BMP
Heart
2023-10-21 11:05:47 发布
342
分类专栏: C/C++ 文章标签: 生成BMP图片 像素数据 转BMP
像素数据转BMP图片
//8位数据 void SaveToBmpGray::save(const unsigned char* src, int height, int width, std::string path, std::string name) { int imagDataSize = height*width; // imag data size //位图第三部分,调色板 RGBQUAD rgbQuad[256]; for (int i = 0; i < 256; ++i) { rgbQuad[i].rgbBlue = (BYTE)i; rgbQuad[i].rgbGreen = (BYTE)i; rgbQuad[i].rgbRed = (BYTE)i; rgbQuad[i].rgbReserved = i; } //位图第一部分,位图文件头 BITMAPFILEHEADER *bfHeader{ new BITMAPFILEHEADER }; bfHeader->bfType = (WORD)0x4d42; // string"BM" bfHeader->bfSize = (DWORD)(imagDataSize + sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(rgbQuad)); // file size bfHeader->bfReserved1 = 0; // reserved bfHeader->bfReserved2 = 0; // reserved bfHeader->bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(rgbQuad)); // real data 位置 //位图第二部分,位图信息头 BITMAPINFOHEADER *biHeader{ new BITMAPINFOHEADER }; biHeader->biSize = sizeof(BITMAPINFOHEADER); biHeader->biWidth = width; biHeader->biHeight = -height;//BMP图片从最后一个点开始扫描,显示时图片是倒着的,所以用-height,这样图片就正了 biHeader->biPlanes = 1;//为1,不用改 biHeader->biBitCount = 8; // 每个像素占用的bit biHeader->biCompression = BI_RGB;//不压缩 biHeader->biSizeImage = imagDataSize; biHeader->biXPelsPerMeter = 0;//像素每米 biHeader->biYPelsPerMeter = 0; biHeader->biClrUsed = 0;//已用过的颜色,24位的为0 biHeader->biClrImportant = 0;//每个像素都重要 //打开文件并保存 //文件路径 std::string fpath; fpath += path; if (name.empty()) fpath += "IMG_"; else fpath += name + "_"; SYSTEMTIME st; GetLocalTime(&st); char time[20]; sprintf_s(time, sizeof(st), "%4d%2d%2d_%2d%2d%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); for (int i = 0; time[i]; ++i) { if (time[i] == ' ') time[i] = '0'; } fpath += time; fpath += ".bmp"; std::fstream file(fpath, std::ios::out or std::ios::binary); file.write((char*)bfHeader, sizeof(BITMAPFILEHEADER)); file.write((char*)biHeader, sizeof(BITMAPINFOHEADER)); file.write((char*)rgbQuad, sizeof(rgbQuad)); file.write((char*)src, imagDataSize); file.close(); }
//24位数据 void SaveToBmp24::save(const unsigned char* src, int height, int width, std::string path, std::string name) { int imagDataSize = height*width * 3; // imag data size //位图第一部分,位图文件头 BITMAPFILEHEADER *bfHeader{ new BITMAPFILEHEADER }; bfHeader->bfType = 0x4d42; // string"BM" bfHeader->bfSize = imagDataSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // file size bfHeader->bfReserved1 = 0; // reserved bfHeader->bfReserved2 = 0; // reserved bfHeader->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); // real data 位置 //位图第二部分,位图信息头 BITMAPINFOHEADER *biHeader{ new BITMAPINFOHEADER }; biHeader->biSize = sizeof(BITMAPINFOHEADER); biHeader->biWidth = width; biHeader->biHeight = height;//BMP图片从最后一个点开始扫描,显示时图片是倒着的,所以用-height,这样图片就正了 biHeader->biPlanes = 1;//为1,不用改 biHeader->biBitCount = 24; // 每个像素占用的bit biHeader->biCompression = BI_RGB;//不压缩 biHeader->biSizeImage = imagDataSize; biHeader->biXPelsPerMeter = 0;//像素每米 biHeader->biYPelsPerMeter = 0; biHeader->biClrUsed = 0;//已用过的颜色,24位的为0 biHeader->biClrImportant = 0;//每个像素都重要 //打开文件并保存 //文件路径 std::string fpath; fpath += path; if (name.empty()) fpath += "IMG_"; else fpath += name + "_"; SYSTEMTIME st; GetLocalTime(&st); char time[20]; sprintf_s(time, sizeof(st), "%4d%2d%2d_%2d%2d%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); for (int i = 0; time[i]; ++i) { if (time[i] == ' ') time[i] = '0'; } fpath += time; fpath += ".bmp"; std::fstream file(fpath, std::ios::out or std::ios::binary); file.write((char*)bfHeader, sizeof(BITMAPFILEHEADER)); file.write((char*)biHeader, sizeof(BITMAPINFOHEADER)); file.write((char*)src, imagDataSize); file.close(); }
ps:由于文章不支持"竖线"符号 上面"or"代替,自行修改


评论列表