灰度图转bmp文件 C++
直接上代码,根据不同需求可以进行改动
#include <stdio.h>
#include <iostream>using namespace std;/
//读写图像文件的结构和函数的定义
/
// 文件头信息, 14 字节
struct sBMPFileHeader
{unsigned short usImageType;//位图文件的类型,必须为BM(1-2字节)unsigned short ulFsize1,ulFsize2;//位图文件的大小,以字节为单位(3-6字节,低位在前)unsigned short usReserved1;//位图文件保留字,必须为0(7-8字节)unsigned short usReserved2;//位图文件保留字,必须为0(9-10字节)unsigned short ulBMPDateOffset1,ulBMPDateOffset2;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)//文件头的偏移量表示,以字节为单位
#ifdef _WIN32
};
#else
}__attribute__((packed));
#endif// BMP信息头,40个字节
struct sBMPInfoHeader
{unsigned int biSize; //本结构所占用字节数(15-18字节)int biWidth; //位图的宽度,以像素为单位(19-22字节)int biHeight; //位图的高度,以像素为单位(23-26字节)unsigned short biPlanes; //目标设备的级别,必须为1(27-28字节)unsigned short biBitCount; //每个像素所需的位数,必须是1(双色),(29-30字节) 4(16色),8(256色)16(高彩色)或24(真彩色)之一unsigned int biCompression; //位图压缩类型,必须是0(不压缩),(31-34字节) 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一unsigned int biSizeImage; //位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)int biXPelsPerMeter; //位图水平分辨率,每米像素数(39-42字节)int biYPelsPerMeter; //位图垂直分辨率,每米像素数(43-46字节)unsigned int biClrUsed; //位图实际使用的颜色表中的颜色数(47-50字节)unsigned int biClrImportant; //位图显示过程中重要的颜色数(51-54字节)
#ifdef _WIN32
};
#else
}__attribute__((packed));
#endif//颜色表
struct sBMPColorQuad
{unsigned char rgbBlue; //蓝色的亮度(值范围为0-255)unsigned char rgbGreen; //绿色的亮度(值范围为0-255)unsigned char rgbRed; //红色的亮度(值范围为0-255)unsigned char rgbReserved;//保留,必须为0
#ifdef _WIN32
};
#else
}__attribute__((packed));
#endifstruct sBMPData
{unsigned int width, height;unsigned int lBitNum;
#ifdef _WIN32unsigned char *data = NULL;
#elseunsigned char *data;
#endif
};int SaveImage(const char *pcFileName, unsigned char *pucImage, int iWidth, int iHeight)
{char pcTMP[255];
#ifdef _WIN32sprintf(pcTMP, "d:\\%s", pcFileName);
#elsesprintf(pcTMP, "%s", pcFileName);
#endifFILE *bmp_file;//打开文件if (!(bmp_file = fopen(pcTMP, "wb")))return 1;int i;int iWidthNew_1 = iWidth;if ((iWidth % 4) != 0)iWidthNew_1 = (iWidth >> 2) << 2;int iCut_1 = iWidth - iWidthNew_1;unsigned char *pucTTTTT = new unsigned char[iWidthNew_1 * iHeight];unsigned char* pucOld = pucImage, *pucNew = pucTTTTT + iWidthNew_1 * (iHeight - 1);for (i = 0; i<iHeight; i++, pucOld += iWidth, pucNew -= iWidthNew_1) //将图像裁剪并在y方向翻转memcpy(pucNew, pucOld, iWidthNew_1);sBMPData sbmpData;sbmpData.width = iWidthNew_1;sbmpData.height = iHeight;sbmpData.lBitNum = 8;sbmpData.data = pucTTTTT;struct sBMPFileHeader bmp_file_header;struct sBMPInfoHeader bmp_info_header;struct sBMPColorQuad bmp_color_quad[256];if (sbmpData.lBitNum == 8){bmp_file_header.usImageType = 0x4D42;//位图文件的类型,必须为BM(1-2字节)bmp_file_header.ulFsize1 = (unsigned short)(sbmpData.width*sbmpData.height + 0x0436);//位图文件的大小,以字节为单位(3-4字节,低位在前)bmp_file_header.ulFsize2 = (unsigned short)((sbmpData.width*sbmpData.height + 0x0436) >> 16);//位图文件的大小,以字节为单位(5-6字节,高位在后)bmp_file_header.ulBMPDateOffset1 = 0x0436; //位图数据的起始位置,以相对于位图(11-12字节,低位在前)bmp_file_header.ulBMPDateOffset2 = 0x00; //位图数据的起始位置,以相对于位图(13-14字节,高位在后)bmp_info_header.biSize = 0x28; //本结构所占用字节数(15-18字节)bmp_info_header.biWidth = sbmpData.width; //位图的宽度,以像素为单位(19-22字节)bmp_info_header.biHeight = sbmpData.height; //位图的高度,以像素为单位(23-26字节)bmp_info_header.biPlanes = 1; //目标设备的级别,必须为1(27-28字节)bmp_info_header.biBitCount = 8;//每个像素所需的位数,必须是1(双色),(29-30字节)bmp_info_header.biCompression = 0; //0x00 位图压缩类型,必须是0(不压缩)bmp_info_header.biSizeImage = 0x00;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)bmp_info_header.biXPelsPerMeter = 0x0b40;//位图水平分辨率,每米像素数(39-42字节)bmp_info_header.biYPelsPerMeter = 0x0b40;//位图垂直分辨率,每米像素数(43-46字节)bmp_info_header.biClrUsed = 0x0100;//位图实际使用的颜色表中的颜色数(47-50字节)bmp_info_header.biClrImportant = 0;//位图显示过程中重要的颜色数(51-54字节)for (i = 0; i<256; i++){bmp_color_quad[i].rgbBlue = (unsigned char)i;//蓝色的亮度(值范围为0-255)bmp_color_quad[i].rgbGreen = (unsigned char)i;//绿色的亮度(值范围为0-255)bmp_color_quad[i].rgbRed = (unsigned char)i; //红色的亮度(值范围为0-255)bmp_color_quad[i].rgbReserved = 0;//保留,必须为0}}else if (sbmpData.lBitNum == 24){bmp_file_header.usImageType = 0x4D42;bmp_file_header.ulFsize1 = (unsigned short)(sbmpData.width*sbmpData.height * 3 + 0x0036);bmp_file_header.ulFsize2 = (unsigned short)((sbmpData.width*sbmpData.height * 3 + 0x0036) >> 16);bmp_file_header.ulBMPDateOffset1 = 0x0036;bmp_file_header.ulBMPDateOffset2 = 0x00;bmp_info_header.biSize = 0x28;bmp_info_header.biWidth = sbmpData.width;bmp_info_header.biHeight = sbmpData.height;bmp_info_header.biPlanes = 1;bmp_info_header.biBitCount = 24;bmp_info_header.biCompression = 0; //0x00bmp_info_header.biSizeImage = 0x00;bmp_info_header.biXPelsPerMeter = 0x0b40;bmp_info_header.biYPelsPerMeter = 0x0b40;bmp_info_header.biClrUsed = 0x0000;bmp_info_header.biClrImportant = 0;}else if (sbmpData.lBitNum == 16){bmp_file_header.usImageType = 0x4D42;bmp_file_header.ulFsize1 = (unsigned short)(sbmpData.width*sbmpData.height * 2 + 0x0036);bmp_file_header.ulFsize2 = (unsigned short)((sbmpData.width*sbmpData.height * 2 + 0x0036) >> 16);bmp_file_header.ulBMPDateOffset1 = 0x0036;bmp_file_header.ulBMPDateOffset2 = 0x00;bmp_info_header.biSize = 0x28;bmp_info_header.biWidth = sbmpData.width;bmp_info_header.biHeight = sbmpData.height;bmp_info_header.biPlanes = 1;bmp_info_header.biBitCount = 16;bmp_info_header.biCompression = 0; //0x00bmp_info_header.biSizeImage = 0x00;bmp_info_header.biXPelsPerMeter = 0x0b40;bmp_info_header.biYPelsPerMeter = 0x0b40;bmp_info_header.biClrUsed = 0x0000;bmp_info_header.biClrImportant = 0;}//写文件头fwrite(&bmp_file_header, sizeof bmp_file_header, 1, bmp_file);//写信息头fwrite(&bmp_info_header, sizeof bmp_info_header, 1, bmp_file);//写图片数据if (sbmpData.lBitNum == 8){for (i = 0; i<256; i++)fwrite(&bmp_color_quad[i], sizeof(bmp_color_quad[i]), 1, bmp_file);fwrite(sbmpData.data, sbmpData.width * sbmpData.height, 1, bmp_file);}else if (sbmpData.lBitNum == 24)fwrite(sbmpData.data, sbmpData.width * sbmpData.height * 3, 1, bmp_file);else if (sbmpData.lBitNum == 16)fwrite(sbmpData.data, sbmpData.width * sbmpData.height * 2, 1, bmp_file);//关闭文件fclose(bmp_file);delete[] pucTTTTT;return 0;
}
灰度图转bmp文件 C++相关推荐
- 照片生成STL浮雕文件视频演示,图片转灰度图,灰度图转STL浮雕图
图片转成STL浮雕图视频教程,照片转成灰度图转STL文件操作演示 把彩色照片转成STL浮雕图视频教程,照片转成灰度图操作演示,把手机拍的照片转成浮雕图效果示例,照片转成灰度图效果示例,彩色照片转成浮雕 ...
- 精雕软件怎么把图片转成灰度图_bmp灰度图怎么转精雕浮雕图和做刀路?
1.文件--输入--点阵图像(选择灰度图,bmp格式的) 2.绘制--绘制出一个你需要做的图案的形状,注意计算比例尺 3.用你绘制的图形来截取灰度图,截取你要的图案部分,截取的部分就是你要做出来的路径 ...
- matlab批量将图片处理为灰度图
matlab批量处理图片的灰度,将其保存在指定创建的文件夹之中. 代码案例如下: clc clear % 将图片批量转化为灰度图 % 首先需要创建灰度图保存的文件夹 % 读取图片的路径格式:'F:\M ...
- 基于二维灰度图的卷积神经网络故障诊断(tensorflow)
本文展示了如何构造一个卷积神经网络 (CNN) 并对自己的数据集进行分类. 1.数据集介绍.读入.转化 本文所用的数据集为西储大学轴承数据集,经过数据预处理将一维时序数据转化为灰度图,对灰度图进行分类 ...
- 图像信息处理:bmp文件、颜色空间转化、灰度图
Chapter 1: course 1.1 Why not make the aperture as small as possible? The quantity of light is too s ...
- 彩色BMP转换成灰度图的原理
图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算.识别. 彩色图转换灰度图的原理如下: 我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为 BITMAPFILEH ...
- c语言 读取 256级 灰度 bmp,256级灰度BMP文件读写源代码c语言图像处理.doc
256级灰度BMP文件读写源代码c语言图像处理 本文档最早发布于 /u/1495182054 1.256级灰度BMP文件读写的源代码! 首先要明白256级灰度BMP文件的格式 1.首先是一个14个字节 ...
- BMP格式图像知识点总结并转灰度图
24位彩图转换为灰度图练习 练习目的 位图知识点 BMP图像存储结构 位图文件头 位图信息头 调色板 位图数据 转灰度图重点 代码例程 练习目的 BMP格式图片灰度化 位图知识点 刚拿到任务时觉得图像 ...
- 计算机论文图片大小,对一副大小为256*256的bmp格式256色的灰度图象进行霍夫曼和字典编码压缩处理...
内容简介: 课程设计 对一副大小为256*256的bmp格式256色的灰度图象进行霍夫曼和字典编码压缩处理,共31页,6992字 目录 绪论1 1原理分析2 1.1数字图象2 1.1.1灰度图象2 1 ...
最新文章
- 【组队学习】【29期】5. 李宏毅机器学习(含深度学习)
- java7 javascript引擎_Java7中脚本引擎的一般用法,共三种方法获得JavaScript引擎:名称、文件扩展名、MIME类型 | 学步园...
- [AS3][Matrix][利用颜色矩阵进行颜色变换]
- Scala集合:reduce(化简)方法使用示例
- 作为团队技术负责人,我是这样面试前端的
- Trapping Rain Water
- 解决多线程同时读写一个文件的问题
- java中jnum i .length,java数组和多维数组
- 属性getter和setter
- Q/A: AD的Kerberos报错
- jdk Arrays类
- 十年牧码,我的平凡之路
- 07_Flask闪现 get_flashed_messages()
- cocos2dX 之音乐与音效
- ResponseResult
- 解决Qt5屏幕翻转问题
- Eclipse is not responding
- 吉大20春学期C语言程序设计作业二,c语言程序设计 教学课件 ppt 作者 吉大17秋学期《C语言程序设计》作业一...
- 自然语言处理(一)——文法(形式语言)基本概念
- 泊松抽样与伯努利抽样主要联系与区别