#include <stdio.h>
#include <fstream.h>
#include <windows.h>
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER InfoHeader;
RGBQUAD Rgb[256];
BYTE *pImg = NULL;
int ImgSize;
//Height=InfoHeader.biHeight;
//Width=InfoHeader.biWidth;
BOOL read(char* filename)
{
FILE * fp;
fp=fopen(filename, "rb");
if(fp == NULL)
{
printf("没有找到该文件\n");
return -1;
}
//读文件头
fread((char *)&FileHeader, 1, sizeof(BITMAPFILEHEADER), fp);
printf("文件长度:%d\n",FileHeader.bfSize);
printf("偏移量:%d\n",FileHeader.bfOffBits);
//读信息头
fread((char *)&InfoHeader, 1, sizeof(BITMAPINFOHEADER), fp);
printf("图像宽度:%d\n",InfoHeader.biWidth);
printf("图像高度:%d\n",InfoHeader.biHeight);
printf("像素位数:%d\n",InfoHeader.biBitCount);
//读调色板
if(InfoHeader.biBitCount==8)//因为除了24bit的图片都有调色板
{
fread((char *)Rgb,1,sizeof(RGBQUAD)*256,fp);
}
//为数据分配空间
ImgSize=FileHeader.bfSize-FileHeader.bfOffBits;
if(pImg != NULL)
free(pImg);
pImg=(BYTE *)malloc(ImgSize);
fread((char*)pImg,1,ImgSize,fp);
fclose(fp);
return 0;
}
BOOL write(char* filename)
{
FILE* fp=fopen(filename, "wb");
if(fp == NULL)
{
printf("没有找到该文件\n");
return -1;
}
fwrite((char *)&FileHeader, 1, sizeof(BITMAPFILEHEADER), fp);
fwrite((char *)&InfoHeader, 1, sizeof(BITMAPINFOHEADER), fp);
//写调色板
if(InfoHeader.biBitCount==8)//因为除了24bit的图片都有调色板
{
fwrite((char *)Rgb,1,sizeof(RGBQUAD)*256,fp);
}
//写图片数据
fwrite((char*)pImg,1,ImgSize,fp);
fclose(fp);
return 0;
}
void ReverseGraylevel()
{
//反转处理
for(int i=0;i<ImgSize;i++)
{
pImg[i]=255-pImg[i];
}
}
int Hist[256];
void Histogram()
{
memset(Hist, 0, sizeof(Hist));
for(int i=0; i<ImgSize; i++)
{
//pImg转换到Hist
Hist[pImg[i]]++;
}
}
void main()
{
//菜单程序部分
int a=0;
printf("请选择您所需操作。\n 请输入以下项目标号实现相关操作。\n1、图像反转\n2、灰度直方图\n3、图片另存为\n");
scanf("%d",a);
switch(a)
{
case 1:
ReverseGraylevel();
if(read("d:\\car8b-g.bmp") < 0)
return;
break;
case 2:
Histogram();
break;
case 3:
write("f:\\new-car.bmp");
break;
}
if(pImg)
free(pImg);
}
- 1
- 2
- 3
前往页