/*********************************************************************************************************************/
//函数名:SaveBmp
//功能: 将像素数据保存文BMP文件
//参数: 分别为文件名、图片宽度、图片高度、每像素比特数、调色板指针、像素数据指针
//返回值:如果保存成功,返回true,否则为false
//说明: bCount参数可以是1、4、8、16、24、32,crPalette参数是一个指向调色板数组的指针,如果没有调色板,该项可以写NULL。
// bPixels是指向像素数据的指针,该项应该与bCount项相匹配。
/**********************************************************************************************************************/
#include "bmp.h"
bool SaveBmp(const char* fileName, int bWidth, int bHeight, int bCount, RGBQUAD* crPalette, byte* bPixels)
{
//调色板字节数
int paletteSize;
switch (bCount)
{
case 1:
paletteSize = 8;
break;
case 4:
paletteSize = 64;
break;
case 8:
paletteSize = 1024;
break;
default:
paletteSize = 0;
break;
}
//需要写进文件的像素字节数
int pixelsSize;
pixelsSize = 4 * ((bCount * bWidth + 31) / 32) * bHeight;
//文件头
BITMAPFILEHEADER bmpFileHeader;
bmpFileHeader.bfType = 'MB';
bmpFileHeader.bfSize = 54 + paletteSize + pixelsSize;
bmpFileHeader.bfReserved1 = 0;
bmpFileHeader.bfReserved2 = 0;
bmpFileHeader.bfOffBits = 54 + paletteSize;
//信息头
BITMAPINFOHEADER bmpInfoHeader;
bmpInfoHeader.biBitCount = bCount;
bmpInfoHeader.biClrImportant = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biCompression = BI_RGB;
bmpInfoHeader.biHeight = bHeight;
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biSize = 40;
bmpInfoHeader.biSizeImage = pixelsSize;
bmpInfoHeader.biWidth = bWidth;
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
//分配新的像素缓冲
byte* pPixels;
if ((bCount * bWidth) % 32 == 0)
{
//如果行的字节数刚好是4的倍数,则直接利用原来的像素缓冲
pPixels = bPixels;
}
else
{
//否则,新创建一个缓冲区,使得每行的字节数刚好是4的倍数
pPixels = (byte*)malloc(pixelsSize);
//像素缓冲初始化为0
memset(pPixels, 0, pixelsSize);
int oldRow, newRow;
//原来的像素缓冲每行所占的字节数
oldRow = (bCount * bWidth + 7) / 8;
//新的像素缓冲每行所占的字节数
newRow = pixelsSize / bHeight;
//将旧的像素缓冲的数据复制到新的像素缓冲
for (int i = 0; i < bHeight; i++)
{
memcpy(pPixels + i * newRow, bPixels + i * oldRow, oldRow);
}
}
FILE* fp;
fp = fopen(fileName, "wb");
if (!fp)
{
return false;
}
//写入文件头
fwrite(&bmpFileHeader, 14, 1, fp);
//写入信息头
fwrite(&bmpInfoHeader, 40, 1, fp);
//写入调色板
fwrite(crPalette, paletteSize, 1, fp);
//写入像素数据
fwrite(pPixels, pixelsSize, 1, fp);
fclose(fp);
//如果像素缓冲区是动态创建的,则释放缓冲
if (pPixels != bPixels)free(pPixels);
return true;
}

shifenglv
- 粉丝: 1479
最新资源
- 电网企业大数据的价值实现探析.docx
- 基本台账-安全生产网络组织台帐.doc
- 扩频通信抗干扰系统分析大学本科方案设计书.doc
- 机械设计制造及其自动化-外文翻译-外文文献-英文文献-液压支架的最优化设计.doc
- 油气勘探项目管理的探讨.docx
- 智能家居中家庭总体布线实战技术解析.docx
- 数字图像处理锐化技术的原理与实现.docx
- 计算机软件的安全检测技术分析.docx
- 51单片机的多路温度采集控制系统方案设计书.doc
- 上海XX有限公司网络安全解决方案.ppt
- 基于网络经济时代下市场营销策略的转变.docx
- 从全球视角看中国移动互联网产业发展现状及地位.docx
- 最新家庭医疗网络救护医疗保健ppt模板.pptx
- 《电气控制与PLC应用》课程整体设计措施.doc
- 国内外工程项目管理现状比较与探讨80801.doc
- 第一章旅游网站基于营销优化的内容建设.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
- 4
前往页