1项目概要
1.1 项目基本要求
编写C/C++程序对bmp图像进行处理
1.2 项目成果
正确实现上述要求,生成相应的文件和实现相应的图片效果。
1.3开发工具和环境
开发工具:vc6.0
操作系统:Windows 7
开发语言: C
2实验需求
2.1实验需求
1、灰度BMP图像的读写:
(1)读入lena.bmp文件;
(2)通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息;
(3)提取出原图像中的位图数据,另存为lena.raw, 并通过photoshop打开该文件,查看所读取的数据。
(4)仅取原始图像左上角1/4的数据,另存一个lenas.bmp图像,在photoshop中打开查看效果。
2. 彩色BMP图像读写
(1)读入文件lena_C.bmp文件;
(2)通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息;
(3)提取出原图像中的位图数据,另存为lena_C.raw, 并通过photoshop打开该文件,查看所读取的数据。
(4)仅取原始图像左上角1/4的数据,另存一个lena_Cs.bmp图像,在photoshop中打开查看效果。
3 关键设计与实现
#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
unsigned char *pBmpBuf;
unsigned char *pBmpBuf1;
bool saveBmp(char *bmpName, unsigned char *imgBuf,
int width, int height,
int biBitCount, RGBQUAD *pColorTable)
{
int biHeight=512,biWidth=512;
FILE *fp1=fopen(“F://lena.bmp”,”rb+”);
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf)
return 0;
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存储图像数据每行字节数为4的倍数
int lineByte=(width * biBitCount/8+3)/4*4;
//以二进制写的方式打开文件
// FILE *fp=fopen(bmpName,”wb”);
FILE *fp2=fopen(“F://lenas.bmp”,”wb+”);
if(fp2==0) return 0;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize= sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
+ colorTablesize + lineByte*height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;
//写文件头进文件
fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp2);
//申请位图信息头结构变量,填写信息7头信息
BITMAPINFOHEADER head;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//写位图信息头进内存
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp2);
//如果灰度图像,有颜色表,写入文件
RGBQUAD *pColorTable1;
if(biBitCount==8)
{
pColorTable1=new RGBQUAD[256];
fread(pColorTable1,sizeof(RGBQUAD),256,fp1);
}
if(biBitCount==8)
fwrite(pColorTable1, sizeof(RGBQUAD),256, fp2);
//写位图数据进文件
int y = (biWidth * biBitCount/8+3)/4*4;
fseek(fp1, -y*biHeight/2,2);
long q;
if((q=ftell(fp1))==-1L)
{
puts(“GetBitmapHeader读取文件指针位置失败!”);
return 0;
}
else
printf(“起始字节:%d\n”,q);
pBmpBuf1=new unsigned char[lineByte*biHeight];
printf(“hello world1”);
int t;
for(t=0;t<biHeight/2;t++)
{
fread(pBmpBuf1,1,y/2,fp1);
fseek(fp1,y/2,1);
fwrite(pBmpBuf1,y/2,1,fp2);
}
printf(“hello world2”);
fclose(fp2);
fclose(fp1);
return 1;
}
void main()
{
FILE *in,*out;
int biWidth,biHeight,biBitCount,startadd;
short int bmph,bmpInfo,*bmpData;
int bfSize;
RGBQUAD *pColorTable;
unsigned char *pBmpBuf;
if((in=fopen(“F:\\lena.bmp”,”rb+”))==NULL)
{
printf(“Can not open this file.\n”);
exit(0);
}
fseek(in,2L,SEEK_SET);
fread(&bfSize,sizeof(int),1,in);
printf(“bfSize is %d\n”,bfSize);
fseek(in,18L,SEEK_SET);
fread(&biWidth,sizeof(int),1,in);
printf(“biWidth is %d\n”,biWidth);
fseek(in,22L,SEEK_SET);
fread(&biHeight,sizeof(int),1,in);
printf(“biHeight is %d\n”,biHeight);
fseek(in,28L,SEEK_SET);
fread(&biBitCount,sizeof(int),1,in);
printf(“biBitCount is %d\n”,biBitCount);
fseek(in,1078L,SEEK_SET);
startadd=ftell(in);
if(startadd==-1L)
printf(“error!\n”);
else
printf(“startadd is %d\n”,startadd);
int lineByte=(biWidth*biBitCount/8+3)/4*4;
if((out=fopen(“f:\\lenas.raw”,”wb+”))==NULL)
{
printf(“Can not open file.\n”);
return;
}
char buf[512][512];
fseek(in,1078L,SEEK_SET);
for(int i=biHeight-1;i>=0;i–)
{
for(int j=0;j<=lineByte-1;j++)
{
fputc(fgetc(in),out);
}
}
fclose(in);
fclose(out);
char writePath[]=”F://lenas.bmp.BMP”;
saveBmp(writePath, pBmpBuf, biWidth/2,biHeight/2, biBitCount, pColorTable);
system(“pause”);
delete []in;
delete []out;
}
4成果截图
4.1灰度图像
4.2彩色图像
今天的文章C语言处理BMP图像分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30923.html