码龄10年 暂无认证

34127
访问
1
等级

8
获赞
3
评论

最新评论

  • 20240228阿⑤

    积分乍获得

  • 20231124ziher

    666

  • 20230909八月老师

    什麼時候發佈易語言支持庫呢

三.《生成BMP图片》像素数据转BMP

Heart 2023-10-21 11:05:47 发布 342

分类专栏: C/C++ 文章标签: 生成BMP图片 像素数据 转BMP

  1. 像素数据转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"代替,自行修改

Heart1
0 0 上传作业
X
    网友评论 0条评论 0人参与
    请登陆会员1

    表情

    评论列表

×