功能老卜扒:读取BMP图像,将其像素值存储在TXT文档中。
#include <iostream>
#include <windows.h>
#include <stdlib.h>
using namespace std
int main()
{
FILE *fpBmp
BITMAPFILEHEADER bmpHeader//包含文件类型、大小和布局的信息
BITMAPINFOHEADER bmpInfHeader//包含位图的尺寸和颜色格式
const char *bmpname = "D://hzy124.bmp"
const char *txtname = "D://hzy124.txt"
if((fpBmp = fopen(bmpname,"rb"))==NULL)//fopen( "D://test.bmp","弊老rb")
{
cout<<"the bmp file can not open!"<<endl
exit(1)
}
//read the BITMAPFILEHEADER
fread(&bmpHeader,sizeof(BITMAPFILEHEADER),1,fpBmp)
//read the BITMAPINFOHEADER
fread(&bmpInfHeader,sizeof(BITMAPINFOHEADER),1,fpBmp)
// read bmp data
unsigned char *bmpData = new unsigned char[bmpInfHeader.biHeight*bmpInfHeader.biWidth*3]
//unsigned char *bmpData = new unsigned char[bmpInfHeader.biHeight*bmpInfHeader.biWidth]//黑白图像
fseek(fpBmp,bmpHeader.bfOffBits,SEEK_SET)
fread(bmpData,1,bmpInfHeader.biHeight*bmpInfHeader.biWidth*3,fpBmp)
//fread(bmpData,1,bmpInfHeader.biHeight*bmpInfHeader.biWidth,fpBmp)//黑白图像
FILE *temp
if((temp = fopen(txtname,"wb"))==NULL)//写TXT文件
{
cout<<"the file can not be built!"<<endl
exit(1)
}
for(int i = 0i<bmpInfHeader.biHeighti++)
{
for(int j = 0j<bmpInfHeader.biWidthj++)
{
fprintf(temp,"%d ",bmpData[i*bmpInfHeader.biWidth*3 + j*3])
fprintf(temp,"%d ",bmpData[i*bmpInfHeader.biWidth*3 + j*3+1])
fprintf(temp,"%d \t",bmpData[i*bmpInfHeader.biWidth*3 + j*3+2])
//fprintf(temp,"%d ",bmpData[i*bmpInfHeader.biWidth + j])//黑白图像
}
fprintf(temp,"\n")
}
fclose(fpBmp)
fclose(temp)
return 0
}
#ifndef BMPRW_H#define BMPRW_H
typedef struct {// 长度12字节
// short bftype // 固定为"BM",VC不能读取一个short,故省略
int bfSize // 位图文件的大小,以字节为单位
short bfReserved1 // 位图文件保留字,必须为0
short bfReserved2 // 位图文件保留字,必须为0
int bfOffBits // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER
typedef struct {// 长度40字节
int biSize // 本结构所占用字节数,长度40字节
int biWidth // 位图的宽度,以像素为单位
int biHeight // 位图的高度,以像素为单位
short biPlanes // 目标设备的级别,必须为1
short biBitCount // 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
int biCompression// 位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
int biSizeImage // 位图的大小,以字节为单位
int biXPelsPerMeter// 位图水平分辨率,每米像素数
int biYPelsPerMeter// 位图垂直分辨率,每米像素塌局培数
int biClrUsed // 位腊春图实际使用的颜色表中的颜色数
int biClrImportant// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER
typedef struct {// 24位真彩色无此结构,256级灰度图长度256*4字节
char rgbBlue // 蓝色的亮度(值范围为0-255)
char rgbGreen // 绿色的亮度(值范围为0-255)
char rgbRed // 红色的亮度(值范围为0-255)
char rgbReserved // 保留,必须为0
} RGBQUAD
void ColorBmpR(char*, unsigned char*) // 彩色bmp图像读
void ColorBmpW(char*, char*, unsigned char*)// 彩色bmp图像写
void GrayBmpR (char*, unsigned char*) // 灰度bmp图像读
void GrayBmpW (char*, char*, unsigned char*)// 灰度bmp图像写
#endif
///////////////////////////////////////////////////////////
#include "stdio.h"
#include "stdlib.h"
#include "Common.h"团唯
#include "BmpRW.h"
/*
Copyright: Li Weiwei
VER:2.00
Function: 读取一幅256灰度的bmp图片入内存
Input: bmp文件名指针,内存中图片数据指针
Output: 无
*/
void GrayBmpR(char *fn, unsigned char *pImage)
{
BITMAPFILEHEADER *pbmpfh // bmp文件头指针
BITMAPINFOHEADER *pbmpi // bmp文件信息头指针
unsigned char*pbitstr // bmp文件数据指针
int i = 0
// 将bmp文件头文件读入*pbmpfh
FILE *rfile = fopen(fn,"rb+")
pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER))
if (!pbmpfh)
{
printf("pbmpfh not enough memory")
}
fseek(rfile,sizeof(short),SEEK_SET)
fread(pbmpfh,sizeof(BITMAPFILEHEADER),1,rfile)
// 将bmp文件信息头文件读入*pbmpi
pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER))
if (!pbmpi)
{
printf("pbmpi not enough memory")
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fread(pbmpi,sizeof(BITMAPINFOHEADER),1,rfile)
// 将bmp文件数据读入*pbitstr
pbitstr = (unsigned char*) malloc(IMAGE_SIZE)
if (!pbitstr)
{
printf("pbitstr not enough memory")
}
fseek(rfile,pbmpfh->bfOffBits,SEEK_SET)
fread(pbitstr,IMAGE_SIZE,1,rfile)
fclose(rfile)
// 将*pbitstr中数据存入*pImage
for (i = 0i <IMAGE_SIZEi++)
{
*(pImage+i) = *(pbitstr+i)
}
// 释放不用的内存空间
free(pbitstr)
free(pbmpi)
free(pbmpfh)
}
/*
Copyright: Li Weiwei
VER:2.00
Function: 读取一幅24位真彩色bmp图片入内存
Input: bmp文件名指针,内存中图片数据指针
Output: 无
*/
void ColorBmpR(char *fn, unsigned char *pImage)
{
BITMAPFILEHEADER *pbmpfh // bmp文件头指针
BITMAPINFOHEADER *pbmpi // bmp文件信息头指针
unsigned char*pbitstr // bmp文件数据指针
int i = 0
// 将bmp文件头文件读入*pbmpfh
FILE *rfile = fopen(fn,"rb+")
pbmpfh = (BITMAPFILEHEADER*) calloc(1, sizeof(BITMAPFILEHEADER))
if (!pbmpfh)
{
printf("pbmpfh not enough memory")
}
fseek(rfile,sizeof(short),SEEK_SET)
fread(pbmpfh,sizeof(BITMAPFILEHEADER),1,rfile)
// 将bmp文件信息头文件读入*pbmpi
pbmpi = (BITMAPINFOHEADER*) calloc(1, sizeof(BITMAPINFOHEADER))
if (!pbmpi)
{
printf("pbmpi not enough memory")
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fread(pbmpi,sizeof(BITMAPINFOHEADER),1,rfile)
// 将bmp文件数据读入*pbitstr
pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3, sizeof(char))
if (!pbitstr)
{
printf("pbitstr not enough memory")
}
fseek(rfile,pbmpfh->bfOffBits,SEEK_SET)
fread(pbitstr,IMAGE_SIZE*3,1,rfile)
fclose(rfile)
// 将*pbitstr中数据存入*pImage
for( i=0 i<IMAGE_SIZE*3 i++ )
{
*(pImage+i) = *(pbitstr+i)
}
// 释放不用的内存空间
free(pbitstr)
free(pbmpi)
free(pbmpfh)
}
/*
Copyright: Li Weiwei
VER:2.00
Function: 写一幅256灰度的bmp图片入文件
Input: 灰度模板文件名指针,待写入bmp文件名指针,内存中图片数据指针
Output: 无
*/
void GrayBmpW(char *rfn, char *wfn, unsigned char *pImage)
{
BITMAPINFOHEADER *pbmpi // bmp文件信息头指针
BITMAPFILEHEADER *pbmpfh // bmp文件头指针
RGBQUAD *pbmprgb // bmp文件调色板指针
unsigned char*pbitstr // bmp文件数据指针
shortbmp_header = 0x4D42// bmp文件头字
shortbmp_end = 0x0000// bmp文件尾字
int i = 0
FILE *rfile = fopen(rfn,"rb+")// 模板bmp文件指针
FILE *wfile = fopen(wfn,"wb+")// 生成bmp文件指针
// 将bmp头字写入文件
fseek(wfile,0,SEEK_SET)
fwrite(&bmp_header,1,sizeof(short),wfile)
// 将模板bmp文件头文件写入生成文件
pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER))
if (!pbmpfh)
{
printf("pbmpfh not enough memory")
}
fseek(rfile,sizeof(short),SEEK_SET)
fread(pbmpfh,1,sizeof(BITMAPFILEHEADER),rfile)
fseek(wfile,sizeof(short),SEEK_SET)
fwrite(pbmpfh,1,sizeof(BITMAPFILEHEADER),wfile)
// 将模板bmp文件信息头文件写入生成文件
pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER))
if (!pbmpi)
{
printf("pbmpi not enough memory")
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fread(pbmpi,1,sizeof(BITMAPINFOHEADER),rfile)
fseek(wfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fwrite(pbmpi,1,sizeof(BITMAPINFOHEADER),wfile)
// 将模板bmp调色板写入生成文件
pbmprgb = (RGBQUAD*) calloc(256,sizeof(RGBQUAD))
if (!pbmprgb)
{
printf("pbmprgb not enough memory")
}
fseek(rfile,sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fread(pbmprgb,256,sizeof(RGBQUAD),rfile)
fclose(rfile) // 关闭模板文件
fseek(wfile,sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fwrite(pbmprgb,sizeof(RGBQUAD),256,wfile)
// 将图像数据pImage写入生成文件
fseek(wfile,pbmpfh->bfOffBits,SEEK_SET)
pbitstr = (unsigned char*) malloc(IMAGE_SIZE)
if (!pbitstr)
{
printf("pbitstr not enough memory")
}
for (i = 0i <IMAGE_SIZEi++)
{
*(pbitstr+i)=*(pImage+i)
}
fwrite(pbitstr,IMAGE_SIZE,1,wfile)
free(pbitstr)
// 将bmp尾字写入文件
fseek(wfile,0,SEEK_END)
fwrite(&bmp_end,1,sizeof(short),wfile)
fclose(wfile) // 关闭生成文件
// 释放不用的内存空间
free(pbmprgb)
free(pbmpi)
free(pbmpfh)
}
/*
Copyright: Li Weiwei
VER:2.00
Function: 写一幅24位真彩色bmp图片入文件
Input: 24位真彩色模板文件名指针,待写入bmp文件名指针,内存中图片数据指针
Output: 无
*/
void ColorBmpW(char *rfn, char *wfn, unsigned char *pImage)
{
BITMAPFILEHEADER *pbmpfh // bmp文件头指针
BITMAPINFOHEADER *pbmpi // bmp文件信息头指针
unsigned char*pbitstr // bmp文件数据指针
shortbmp_header = 0x4D42// bmp文件头字
int i = 0
FILE *rfile = fopen(rfn,"rb+")// 模板bmp文件指针
FILE *wfile = fopen(wfn,"wb+")// 生成bmp文件指针
// 将bmp头字写入文件
fseek(wfile, 0, SEEK_SET)
fwrite(&bmp_header,1,sizeof(short),wfile)
// 将模板bmp文件头文件写入生成文件
pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER))
if (!pbmpfh)
{
printf("not enough memory")
}
fseek(rfile,sizeof(short),SEEK_SET)
fread(pbmpfh,1,sizeof(BITMAPFILEHEADER),rfile)
fseek(rfile,sizeof(short),SEEK_SET)
fwrite(pbmpfh,1,sizeof(BITMAPFILEHEADER),wfile)
// 将模板bmp文件信息头文件写入生成文件
pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER))
if (!pbmpi)
{
printf("not enough memory")
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fread(pbmpi,1,sizeof(BITMAPINFOHEADER),rfile)
fseek(wfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET)
fwrite(pbmpi,1,sizeof(BITMAPINFOHEADER),wfile)
// 将图像数据写入生成文件
pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3,sizeof(char))
if (!pbitstr)
{
printf("not enough memory")
}
// 将*pImage中数据写入*pbitstr
for( i=0 i<IMAGE_SIZE*3 i++ )
{
*(pbitstr+i) = *(pImage+i)
}
fseek(wfile,pbmpfh->bfOffBits,SEEK_SET)
fwrite(pbitstr,IMAGE_SIZE*3,1,wfile)
fclose(wfile)
// 释放不用的内存空间
free(pbitstr)
free(pbmpi)
free(pbmpfh)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)