码龄10年
暂无认证
43370
访问
1
等级
8
获赞
3
评论
热门文章
-
一.某岛之人物对象及其加密函数解析
2654
-
一.《传奇M》装备栏遍历的突破口
2281
-
二.某龙端游中LUA的分析和调用
2036
-
一.窗口坐标与屏幕坐标
1757
-
一.《轩辕传奇》周围遍历之二叉树
1755
最新评论
-
20240228阿⑤
积分乍获得
-
20231124ziher
666
-
20230909八月老师
什麼時候發佈易語言支持庫呢
三.《生成BMP图片》像素数据转BMP
Heart
2023-10-21 11:05:47 发布
397
分类专栏: 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"代替,自行修改
网友评论
0条评论 0人参与
评论列表
0
0