/************************************************************************/
/* 文件名称:bmp图像模块
功能描述:该文件包含了:
1、读取不同位数的bmp文件,然后将其转换为24位bmp图像;
2、写入不同位数的bmp文件;
3、将不同位数的bmp图像转换为24位bmp图像;
输入 :二值图像
输出 :二值图像中符合模式点的位置集合
版本号 :
日期 :2013.07.05 作者 : 所有权 :
*/
/************************************************************************/
#include "BitMap.h"
#include "ImageData.h"
#include "ConfigFile.h"
// 函数功能: 提取一幅图像的bmp信息头数据;
// 输入 : 指向bmp文件的指针fp;
// 输出 : 图像的宽、高、深度、文件每行的字节数;
void getImageInfo(BmpInfo &bmpInfo, FILE *&fp)
{
// 跳过位图文件头结构BITMAPFILEHEADER
// fseek(fp, sizeof(BMP_BITMAPFILEHEADER), 0);
// 跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
int fileH1 = sizeof(BMP_BITMAPFILEHEADER);
int fileH2 = sizeof(BITMAPFILEHEADER);
// 定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER infoHeader;
fread(&infoHeader, sizeof(BMP_BITMAPINFOHEADER), 1, fp);
if (24 != infoHeader.biBitCount)
{
exit(-1) ;
}
int lineBytes = (infoHeader.biWidth * infoHeader.biBitCount / 8 + 3) / 4 * 4; // 每一行的字节数
bmpInfo.bitMapInfoHeader.biWidth = infoHeader.biWidth;
bmpInfo.bitMapInfoHeader.biHeight = infoHeader.biHeight;
bmpInfo.bitMapInfoHeader.biBitCount = infoHeader.biBitCount;
bmpInfo.lineBytes = lineBytes;
}
// 函数功能: 读取不同位数的bmp图像,并将图像转换为24位图像,保存到数组中;
// 输入 : 图像文件名(带路径);
// 输出 : 图像的宽、高、24位图像数据的数组;
unsigned char* readBMP(const char* pFileName, int& width, int& height)
{
if (!pFileName)
{
return NULL;
}
FILE *fp = fopen(pFileName, "rb");
if (!fp)
{
return NULL;
}
unsigned char *pData = NULL;
// 判断BMP图片类型
BITMAPFILEHEADER fileHeader;
fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
if (fileHeader.bfType != 0x4d42)
{
exit(-1);
}
// BMP信息格式头
BITMAPINFOHEADER infoHeader;
fseek(fp, sizeof(BITMAPFILEHEADER), 0);
fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
fclose(fp);
#if 1
// 将读进来的图片都转换为24位
switch (infoHeader.biBitCount)
{
case 24: // 24位位图
pData = readBMP24(pFileName, width, height);
break;
case 32: // 32位位图
pData = convertBmp32To24(pFileName, width, height);
break;
case 1: // 1位位图
pData = convertBmpUnder24To24(pFileName, width, height);
break;
case 4: // 4位位图
pData = convertBmpUnder24To24(pFileName, width, height);
break;
case 8: // 8位位图
pData = convertBmpUnder24To24(pFileName, width, height);
break;
default:
return NULL;
}
#endif
//fclose(fp);
return pData;
}
// 函数功能: 读取24位bmp图像;
// 输入 : 图像文件名(带路径);
// 输出 : 图像的宽、高、24位图像数据的数组;
unsigned char* readBMP24(const char* pFileName, int& width, int& height)
{
FILE *fp = fopen(pFileName, "rb"); // 二进制读方式打开指定的图像文件
if (0 == fp)
{
return 0;
}
// 判断图片BMP类型
BMP_BITMAPFILEHEADER fileHeader;
//fread(&fileHeader, sizeof(BMP_BITMAPFILEHEADER), 1, fp);
fread( &(fileHeader.bfType), 2, 1, fp);
fread( &(fileHeader.bfSize), 4, 1, fp);
fread( &(fileHeader.bfReserved1), 2, 1, fp);
fread( &(fileHeader.bfReserved2), 2, 1, fp);
fread( &(fileHeader.bfOffBits), 4, 1, fp);
if (fileHeader.bfType != 0x4d42) // 0x4d42代表BMP格式
{
exit(-1);
}
unsigned int pos = fileHeader.bfOffBits;
BmpInfo bmpInfo;
// 获得输入图像的信息
getImageInfo(bmpInfo, fp);
int lineBytes = bmpInfo.lineBytes;
int bmpHeight = bmpInfo.bitMapInfoHeader.biHeight;
width = bmpInfo.bitMapInfoHeader.biWidth;
height = bmpInfo.bitMapInfoHeader.biHeight;
// 计算每一行不满4字节整数倍情况时,所需填补的字节数
int padWidth = width * 3;
int pad = 0;
if (padWidth % 4 != 0)
{
pad = 4 - (padWidth % 4);
padWidth += pad;
}
int allBytes = lineBytes * bmpHeight;
// 将位图数据读到内存中
unsigned char *pData = new unsigned char[allBytes];
memset(pData, 0, lineBytes * bmpHeight);
int result = fread(pData, allBytes, 1, fp);
if (!result)
{
delete [] pData;
return NULL;
}
fclose(fp);
// 将(B, G, R)变为(R, G, B)
// unsigned char tmp;
// unsigned char *pIn = pData, * pOut= pData;
//
// for (int j = 0; j < height; ++j)
// {
// for (int i = 0; i < width; ++i)
// {
// pOut[1] = pIn[1];
//
// tmp = pIn[2];
// pOut[2] = pIn[0];
// pOut[0] = tmp;
//
// pIn +=3;
// pOut += 3;
// }
// pIn += pad;
// }
//return pData;
unsigned char tmp;
unsigned char *pIn = pData;
unsigned char * pOut= new unsigned char[3 * width * height];
for (int y = 0, index = 0; y < height; ++y)
{
for (int x = 0; x < width; x++, index++)
{
pOut[3 * index] = pData[3 * index];
pOut[3 * index + 1] = pData[3 * index + 1];
pOut[3 * index + 2] = pData[3 * index + 2];
}
pData += pad; // 跳过每一行的补齐位
}
delete []pData;
return pOut;
}
// 函数功能: 读取24位bmp图像,并将图像中的数据转换到0~1之间;
// 输入 : pFname
// 输出 : pImgR, pImgG, pImgB, width, height
void readBMP24( const char* pFname, float*& pImgR, float*& pImgG, float*& pImgB, int& width, int& height )
{
unsigned char* pImg = readBMP24(pFname, width, height);
if (!pImg)
{
printf("Null pointer in readBMP\n");
return;
}
pImgR = new float[width * height];
pImgG = new float[width * height];
pImgB = new float[width * height];
// 将颜色标准化到0~1之间
for (int y = 0, index = 0; y < height; y++)
{
for (int x = 0; x < width; x++, index++)
{
pImgR[index] = pImg[3 * index] / 255.0f;
pImgG[index] = pImg[3 * index + 1] / 255.0f;
pImgB[index] = pImg[3 * index + 2] / 255.0f;
}
}
delete []pImg;
}
// 函数功能: 将24位bmp图像转换为RGB 3个数组分量,并将图像中的数据转换到0~1之间;
// 输入 : pImg, width, height
// 输出 : pImgR, pImgG, pImgB,
void split24ImgToRGBArray( const unsigned char* pImg, float* pImgR, float* pImgG, float* pImgB, int& width, int& height )
{
if (!pImg)
{
printf("Null pointer in readBMP\n");
return;
}
// pImgR = new float[width * height];
// pImgG = new float[width * height];
// pImgB = new float[width * height];
// 将颜色标准化到0~1之间
for (int y = 0, index = 0; y < height; y++)
{
for (int x = 0; x < width; x++, index++)
{
pImgR[index] = pImg[3 * index] / 255.0f;
pImgG[index] = pImg[3 * index + 1] / 255.0f;
pImgB[index] = pImg[3 * index + 2] / 255.0f;
}
}
}
// 函数功能: 将rgb三个数组中的数据还原成rgb的组合,数据转换后写到bmp文件中;
// 输入 : pFname, pImgR, pImgG, pImgB, width, height
// 输出 : 24位bmp图像
void writeBMP(const char *pIname, int width, int height, float *pDataR, float *pDataG, float *pDataB)
{
unsigned char *pImg = new unsigned char[BYTES_PER_PIX * width * height];
// 将图像从0~1区间还原为0~255区间
for (int y = 0, index = 0; y < height; y++)
{
for (int x = 0; x < width; x++, index++)
{
if (pDataR[index] < MIN_UNIN_COLOR) { pImg[BYTES_PER_PIX * index] = BLACK;}
else if (pDataR[index] > MAX_UNIN_COLOR) { pImg[BYTES_PER_PIX * index] = WHITE;}
else { pImg[BYTES_PER_PIX * index] = (unsigned char)(pDataR[index] * COLOR_TRANSFER_FACTOR);}
if (pDataG[index] < MIN_UNIN_COLOR) { pImg[BYTES_PER_PIX * index + 1] = BLACK;}
else if (pDataG[index] > MAX_UNIN_COLOR) { pImg[BYTES_PER_PIX * index + 1] = WHITE;}
else { pImg[BYTES_PER_PIX * index + 1] = (unsigned char)(pDataG[index] * COLOR_TRANSFER_FACTOR);}
if (pDataB[index] < MIN_UNIN_COLOR)
没有合适的资源?快使用搜索试试~ 我知道了~
Bmp图像读取写入与转换
共20个文件
h:5个
cpp:3个
obj:2个
5星 · 超过95%的资源 需积分: 10 12 下载量 171 浏览量
2013-07-16
20:51:06
上传
评论
收藏 658KB RAR 举报
温馨提示
1、可以读取1位、8位、24位、32位的bmp文件; 2、将不同位的bmp图像转为24位bmp图像; 3、可以保存为黑白、256、真彩色图像。
资源推荐
资源详情
资源评论
收起资源包目录
BmpReadWrite.rar (20个子文件)
ImageSpliter
ImageSpliter
stdafx.cpp 12KB
stdafx.h 9KB
widthcommon.h 5KB
ImageSpliter.vcproj.PC-201212040912.Administrator.user 1KB
BitMap.h 2KB
input.bmp 1.88MB
BitMap.cpp 22KB
ConfigFile.h 2KB
ImageSpliter.vcproj 4KB
Debug
BitMap.obj 73KB
BuildLog.htm 10KB
vc90.pdb 108KB
vc90.idb 139KB
mt.dep 67B
ImageSpliter.exe.intermediate.manifest 621B
Main.obj 9KB
ImageData.h 4KB
Main.cpp 378B
ImageSpliter.suo 30KB
ImageSpliter.sln 902B
共 20 条
- 1
资源评论
- vcshox2013-11-26功能还行,主要是相互转换
- 日出西方12342014-08-27vs2009的文件,有源代码
try2find
- 粉丝: 15
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功