C++数字图像处理(不用opencv)

转载:https://www.lavenderdh.cn/2020/11/09/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%EF%BC%9ABMP%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%EF%BC%88%E6%8E%A7%E5%88%B6%E5%8F%B0%E7%A8%8B%E5%BA%8F%EF%BC%89/

本文作者: Lavender @lavender

本文链接: https://www.lavenderdh.cn/2020/11/09/数字图像处理:BMP图像处理(控制台程序)/

版权声明: 本站所有文章除特别声明外,均采用 (CC)BY-NC-SA 许可协议。转载请注明出处!

实验任务书:
编写一个 VC++ 的控制台程序。要求如下:

一、打开一个 BMP 图像文件(图像大小不要太大)。

二、显示图像文件的数据。

对于读入的图像文件,显示位图数据 (选择一部分区域显示即可)。用 256 色或 256 级灰度图像进行验证。有两种显示方式:从上到下,从下到上。自己验证。

三、计算图像的直方图 (可以只显示灰度级 100~200 的直方图,为 0 的不显示;大小的处理,先归一化,再乘以 50)

对于 256 级灰度级的图像进行计算。存入一个 256 元素的数组中,并显示其数据。用图形的方式显示(数据为 0 的不显示,如果值太大,按比例缩小一下)。

四、图像的增亮或减暗

输入一个数字,如果是正数对图像进行增亮,如果是负数对图像进行减暗。

用其他软件进行查看,源图像和被增亮或减暗的图像进行对比,是不是达到了预想的效果。

五、main () 函数的要求

有选择。

main () 函数将指定 BMP 文件读入内存,将图像信息打印输出,最后又原样存入指定文件中。并进行计算需要的数据。

界面:

0---------- 结束

1---------- 读图像(8/24 位)

2----------- 写图像(8/24 位)

3----------- 显示图像数据(1 行到 10 行,1 列到 10 列,1010*** 的大小)(8/24 位)

4----------- 计算直方图(100-200 之间的灰度,1-10 行,1-0 列,1010*** 的大小)(8 位)

5----------- 对图像进行增亮或减暗(如加上 50 或减去 50**** 等)(8 位)

6----------- 图像反色

7----------- 变成灰度图(8/24 位)

8----------- 显示调色板 (8 位)

9-----------24 位彩色图像转换为 8**** 位灰度图像

10-----------24 位彩色图像转换为 8**** 位彩色图像


#include 
#include 
#include 
using namespace std;
unsigned char *pBmpBuf;
int bmpWidth;
int bmpHeight;
RGBQUAD *pColorTable;
int biBitCount;
unsigned int **out_r;
unsigned int **out_g;
unsigned int **out_b;
bool readBmp(char *bmpName) // 读图像
{
    FILE *fp=fopen(bmpName,"rb");//二进制格式打开文件
    if(fp==0)
        return 0;
    fseek(fp,sizeof(BITMAPFILEHEADER),0);//文件指针跳过第一个结构体,定位到第二个结构体
    BITMAPINFOHEADER head;
    fread(&head,sizeof(BITMAPINFOHEADER),1,fp);//向head中写入第二个结构体的信息
    bmpWidth=head.biWidth;
    bmpHeight=head.biHeight;
    biBitCount=head.biBitCount;
    int lineByte=bmpWidth*biBitCount/8;//每行占几个Byte
    if(biBitCount==8)
    {
        pColorTable=new RGBQUAD[256];
        fread(pColorTable,sizeof(RGBQUAD),256,fp);
    }
    pBmpBuf=new unsigned char[lineByte*bmpHeight];//图像内容
    fread(pBmpBuf,1,lineByte*bmpHeight,fp);
    fclose(fp);
    return 1;
}
bool saveBmp(char *bmpName,unsigned char *imgBuf,int width,int height,int biBitCount,RGBQUAD *pColorTable) // 写图像
{
    if(!imgBuf) return 0;
    int colorTablesize=0;
    if(biBitCount==8) colorTablesize=1024;
    int lineByte=(width*biBitCount/8+3)/4*4;//为什么要是4的倍数
    FILE *fp=fopen(bmpName,"wb");
    if(fp==0) return 0;
    BITMAPFILEHEADER fileHead;
    fileHead.bfType=0x4D42;
    fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;
    fileHead.bfReserved1=0;
    fileHead.bfReserved2=0;
    fileHead.bfOffBits=54+colorTablesize;
    fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
    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,fp);
    if(biBitCount==8)
        fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
    fwrite(imgBuf,height*lineByte,1,fp);
    fclose(fp);
    return 1;
}
bool saveBmp_2(char *bmpName,unsigned char *imgBuf,int width,int height,int biBitCount,RGBQUAD *pColorTable) // 写图像
{
    if(!imgBuf) return 0;
    int colorTablesize=1024;
    int lineByte=(width*biBitCount/8+3)/4*4;
    int fix=lineByte-bmpWidth*3;
    unsigned char *p=imgBuf;
    FILE *fp=fopen(bmpName,"wb");
    if(fp==0) return 0;
    int lineBytetmp=((width*8)/8+3)/4*4;
    int fixtmp=lineBytetmp-bmpWidth;
    unsigned char *imgBuftmp=new unsigned char[lineBytetmp*bmpHeight];
    BITMAPFILEHEADER fileHead;
    fileHead.bfType=0x4D42;
    fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4+lineBytetmp*bmpHeight;
    fileHead.bfReserved1=0;
    fileHead.bfReserved2=0;
    fileHead.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4;
    fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
    BITMAPINFOHEADER head;
    head.biBitCount=8;
    head.biClrImportant=0;
    head.biClrUsed=256;
    head.biCompression=BI_RGB;
    head.biHeight=height;
    head.biPlanes=1;
    head.biSize=40;
    head.biSizeImage=lineBytetmp*height;
    head.biWidth=width;
    head.biXPelsPerMeter=0;
    head.biYPelsPerMeter=0;
    fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
    RGBQUAD *pColorTabletmp=new RGBQUAD[256];
    for(int i=0;i<256;i++)
    {
        pColorTabletmp[i].rgbBlue=i;
        pColorTabletmp[i].rgbGreen=i;
        pColorTabletmp[i].rgbRed=i;
        pColorTabletmp[i].rgbReserved=0;
    }
    int pos=0;
    for(int i=0;i<bmpHeight;i++)
    {
        for(int j=0;j<bmpWidth;j++)
        {
            int blue=*p++;
            int green=*p++;
            int red=*p++;
            int gray=0.3*red+0.59*green+0.11*blue;
            imgBuftmp[pos]=gray;
            pos++;
        }
        p+=fix;
        for(int i=0;i<fixtmp;i++)
        {
            imgBuftmp[pos]=0;
            pos++;
        }
    }
    delete []pColorTable;
    delete []imgBuf;
    fwrite(pColorTabletmp,sizeof(RGBQUAD),256,fp);
    fwrite(imgBuftmp,height*lineBytetmp,1,fp);
    fclose(fp);
    return 1;
}
bool saveBmp_3(char *bmpName,unsigned char *imgBuf,int width,int height,int biBitCount,RGBQUAD *pColorTable) // 写图像
{
    if(!imgBuf) return 0;
    int colorTablesize=1024;
    int lineByte=(width*biBitCount/8+3)/4*4;
    int fix=lineByte-bmpWidth*3;
    unsigned char *p=imgBuf;
    FILE *fp=fopen(bmpName,"wb");
    if(fp==0) return 0;
    int lineBytetmp=((width*8)/8+3)/4*4;
    int fixtmp=lineBytetmp-bmpWidth;
    unsigned char *imgBuftmp=new unsigned char[lineBytetmp*bmpHeight];
    BITMAPFILEHEADER fileHead;
    fileHead.bfType=0x4D42;
    fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4+lineBytetmp*bmpHeight;
    fileHead.bfReserved1=0;
    fileHead.bfReserved2=0;
    fileHead.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4;
    fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
    BITMAPINFOHEADER head;
    head.biBitCount=8;
    head.biClrImportant=0;
    head.biClrUsed=256;
    head.biCompression=BI_RGB;
    head.biHeight=height;
    head.biPlanes=1;
    head.biSize=40;
    head.biSizeImage=lineBytetmp*height;
    head.biWidth=width;
    head.biXPelsPerMeter=0;
    head.biYPelsPerMeter=0;
    fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
    RGBQUAD *pColorTabletmp=new RGBQUAD[256];
    int R[4]={0,85,170,255};
    int G[16]={0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255};
    int B[4]={0,85,170,255};
    int numcolortable=0;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<16;j++)
        {
            for(int k=0;k<4;k++)
            {
                pColorTabletmp[numcolortable].rgbRed=R[i];
                pColorTabletmp[numcolortable].rgbGreen=G[j];
                pColorTabletmp[numcolortable].rgbBlue=B[k];
                numcolortable++;
            }
        }
    }
    int pos=0;
    for(int i=0;i<bmpHeight;i++)
    {
        for(int j=0;j<bmpWidth;j++)
        {
            int blue=*p++;
            int green=*p++;
            int red=*p++;
            red=red/85*85;
            green=green/17*17;
            blue=blue/85*85;
            int _tmp=0;
            for(int i=0;i<256;i++)
            {
                if(red==pColorTabletmp[i].rgbRed&&green==pColorTabletmp[i].rgbGreen&&blue==pColorTabletmp[i].rgbBlue)
                {
                    _tmp=i;
                    break;
                }
            }
            imgBuftmp[pos]=_tmp;
            pos++;
        }
        p+=fix;
        for(int i=0;i<fixtmp;i++)
        {
            imgBuftmp[pos]=0;
            pos++;
        }
    }
    delete []pColorTable;
    delete []imgBuf;
    fwrite(pColorTabletmp,sizeof(RGBQUAD),256,fp);
    fwrite(imgBuftmp,height*lineBytetmp,1,fp);
    fclose(fp);
    return 1;
}
void startbmp(char *bmpName)  // 打开图片
{
    readBmp(bmpName);
    char writePath[] = "bmp_start.bmp";
	saveBmp(writePath,pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
    system("start bmp_start.bmp");
    system("pause");
}
void ImageShow(char *bmpName)// 显示图像数据
{
    readBmp(bmpName);
    cout<<"width="<<bmpWidth<<" height="<<bmpHeight<<" biBitCount="<<biBitCount<<endl;
    int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
    int n=0,count_pixel=0;
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    if(biBitCount==8)
    {
        for(int i=0;i<bmpHeight;i++)
        {
            for(int j=0;j<bmpWidth;j++)
            {
                out_r[bmpHeight-1-i][j]=pBmpBuf[j*3+2+bmpWidth*i*3];
                n++;
            }
        }
        cout<<"总的像素个素为:"<<n<<endl;
        cout<<"前十行十列10*10的数据:"<<endl;
        for(int i=0;i<10;i++)
		{
			for(int j=0;j<10;j++)
			{
				cout<<out_r[i][j]<<" ";
			}
            cout<<endl;
        }
    }
    if(biBitCount==24)
    {
        for(int i=0;i<bmpHeight;i++)
        {
            for(int j=0;j<bmpWidth;j++)
            {
                for(int k=0;k<3;k++)
                {
                    count_pixel++;
                }
                n++;
            }
        }
        cout<<"总的像素个素为:"<<n<<endl;
    }
    if(biBitCount==24)
	{
		for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
				out_r[bmpHeight-1-i][j]=pBmpBuf[j*3+2+bmpWidth*i*3];
				out_g[bmpHeight-1-i][j]=pBmpBuf[j*3+1+bmpWidth*i*3];
				out_b[bmpHeight-1-i][j]=pBmpBuf[j*3+bmpWidth*i*3];
			}
		}
        cout<<"前十行十列10*10的数据:"<<endl;
		for(int i=0;i<10;i++)
		{
			for(int j=0;j<10;j++)
			{
				cout<<out_r[i][j]<<" ";
				cout<<out_g[i][j]<<" ";
				cout<<out_b[i][j]<<" ";
                cout<<"\t";
			}
            cout<<endl;
		}
	}
    system("pause");
}
void ImageShow_2(char *bmpName)// 显示图像数据
{
    readBmp(bmpName);
    cout<<"width="<<bmpWidth<<" height="<<bmpHeight<<" biBitCount="<<biBitCount<<endl;
    int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
    int n=0,count_pixel=0;
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    if(biBitCount==8)
    {
        for(int i=0;i<bmpHeight;i++)
        {
            for(int j=0;j<bmpWidth;j++)
            {
                out_r[bmpHeight-1-i][j]=pBmpBuf[j*3+2+bmpWidth*i*3];
                n++;
            }
        }
        cout<<"总的像素个素为:"<<n<<endl;
    }
}
void Histogram(char *bmpName)// 直方图
{
    int num[256]={0};
    int col_r[256]={0};
    int bmpsize=bmpWidth*bmpHeight;
    readBmp(bmpName);
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    if(biBitCount==8)
    {
        for(int i=0;i<bmpHeight;i++)
        {
            for(int j=0;j<bmpWidth;j++)
            {
                out_r[bmpHeight-1-i][j]=pBmpBuf[j*3+2+bmpWidth*i*3];
            }
        }
        for(int k=0;k<256;k++)
        {
            for(int i=0;i<bmpHeight;i++)
		    {
			    for(int j=0;j<bmpWidth;j++)
			    {
                    if(k==out_r[i][j])
                        num[k]++;
			    }
            }
        }
        cout<<"直方图:"<<endl;
        for(int i=0;i<256;i++)
            cout<<num[i]<<" ";
        cout<<endl;
        for(int i=0;i<256;i++)
        {
            col_r[i]=((double)num[i]/bmpsize)*50;
        }
        for(int i=0;i<256;i++)
        {
            cout<<i<<":";
            for(int j=0;j<col_r[i];j++)
                cout<<"*";
            cout<<endl;
        }
    }
    system("pause");
}
void BrightDark(char *bmpName)// 增量或减暗
{
    readBmp(bmpName);
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    int num_b_d;
    cin>>num_b_d;
    if(biBitCount==8)
    {
        for (int i=0;i<256;i++)
		{
			pColorTable[i].rgbBlue+=num_b_d;
			pColorTable[i].rgbGreen+=num_b_d;
			pColorTable[i].rgbRed+=num_b_d;
		}
        for(int i=0;i<256;i++)
		{
			if(pColorTable[i].rgbBlue>255)
                pColorTable[i].rgbBlue=255;
            if(pColorTable[i].rgbBlue<0)
                pColorTable[i].rgbBlue=0;
            if(pColorTable[i].rgbGreen>255)
                pColorTable[i].rgbGreen=255;
            if(pColorTable[i].rgbGreen<0)
                pColorTable[i].rgbGreen=0;
            if(pColorTable[i].rgbRed>255)
                pColorTable[i].rgbRed=255;
            if(pColorTable[i].rgbRed<0)
                pColorTable[i].rgbRed=0;
        }
    }
    char writePath[] = "bmp_bri_dar.bmp";
	saveBmp(writePath,pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
	delete[]pBmpBuf;
	if (biBitCount == 8)
		delete[]pColorTable;
    system("start bmp_bri_dar.bmp");
    system("pause");
}
void Inverse(char *bmpName) // 反色
{
    readBmp(bmpName);
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    if(biBitCount==8)
    {
        for (int i=0;i<256;i++)
		{
			pColorTable[i].rgbBlue=255-pColorTable[i].rgbBlue;
			pColorTable[i].rgbGreen=255-pColorTable[i].rgbGreen;
			pColorTable[i].rgbRed=255-pColorTable[i].rgbRed;
		}
    }
    if(biBitCount==24)
	{
        int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
		int fix=lineByte-bmpWidth*3;
		for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
				out_r[bmpHeight-1-i][j]=pBmpBuf[j*3+2+bmpWidth*i*3+i*fix];
				out_g[bmpHeight-1-i][j]=pBmpBuf[j*3+1+bmpWidth*i*3+i*fix];
				out_b[bmpHeight-1-i][j]=pBmpBuf[j*3+bmpWidth*i*3+i*fix];
			}
		}
		for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
                out_r[i][j]=255-out_r[i][j];
                out_g[i][j]=255-out_g[i][j];
                out_b[i][j]=255-out_b[i][j];
			}
		}
        for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
                pBmpBuf[j*3+2+bmpWidth*i*3+i*fix]=out_r[bmpHeight-1-i][j];
				pBmpBuf[j*3+1+bmpWidth*i*3+i*fix]=out_g[bmpHeight-1-i][j];
				pBmpBuf[j*3+bmpWidth*i*3+i*fix]=out_b[bmpHeight-1-i][j];
			}
		}
	}
    char writePath[] = "bmp_inverse.bmp";
	saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
	delete[]pBmpBuf;
	if (biBitCount == 8)
		delete[]pColorTable;
    system("start bmp_inverse.bmp");
    system("pause");
}
void ConvertGray(char *bmpName) // 变成灰度图
{
    readBmp(bmpName);
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    if(biBitCount==8)
    {
        for (int i=0;i<256;i++)
		{
			pColorTable[i].rgbBlue=0.11*pColorTable[i].rgbBlue+0.59*pColorTable[i].rgbGreen+0.3*pColorTable[i].rgbRed;
			pColorTable[i].rgbGreen=pColorTable[i].rgbRed=pColorTable[i].rgbBlue;
		}
    }
    if(biBitCount==24)
	{
        int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
		int fix=lineByte-bmpWidth*3;
		for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
				out_r[bmpHeight-1-i][j]=pBmpBuf[j*3+2+bmpWidth*i*3+i*fix];
				out_g[bmpHeight-1-i][j]=pBmpBuf[j*3+1+bmpWidth*i*3+i*fix];
				out_b[bmpHeight-1-i][j]=pBmpBuf[j*3+bmpWidth*i*3+i*fix];
			}
		}
		for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
                out_r[i][j]=0.3*out_r[i][j]+0.59*out_g[i][j]+0.11*out_b[i][j];
                out_g[i][j]=out_b[i][j]=out_r[i][j];
			}
		}
        for(int i=0;i<bmpHeight;i++)
		{
			for(int j=0;j<bmpWidth;j++)
			{
                pBmpBuf[j*3+2+bmpWidth*i*3+i*fix]=out_r[bmpHeight-1-i][j];
				pBmpBuf[j*3+1+bmpWidth*i*3+i*fix]=out_g[bmpHeight-1-i][j];
				pBmpBuf[j*3+bmpWidth*i*3+i*fix]=out_b[bmpHeight-1-i][j];
			}
		}
	}
    char writePath[] = "bmp_gray.bmp";
	saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
	delete[]pBmpBuf;
	if (biBitCount == 8)
		delete[]pColorTable;
    system("start bmp_gray.bmp");
    system("pause");
}
void palette(char *bmpName) // 显示调色板
{
    readBmp(bmpName);
	out_r=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_r[i]=new unsigned int[bmpWidth];
	out_g=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_g[i]=new unsigned int[bmpWidth];
	out_b=new unsigned int *[bmpHeight];
	for(int i=0;i<bmpHeight;i++)
		out_b[i]=new unsigned int[bmpWidth];
    if(biBitCount==8)
    {
        for (int i=0;i<256;i++)
		{
			cout<<(double)pColorTable[i].rgbRed<<"\t"<<(double)pColorTable[i].rgbGreen<<"\t"<<(double)pColorTable[i].rgbBlue;
            cout<<endl;
		}
    }
    system("pause");
}
void TFtoEgray(char *bmpName)
{
    readBmp(bmpName);
	char writePath[] = "24to8gray.bmp";
	saveBmp_2(writePath,pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
    system("start 24to8gray.bmp");
    ImageShow_2("24to8gray.bmp");
    system("pause");
}
void TFtoEcolor(char *bmpName)
{
    readBmp(bmpName);
	char writePath[] = "24to8color.bmp";
	saveBmp_3(writePath,pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
    system("start 24to8color.bmp");
    ImageShow_2("24to8color.bmp");
    system("pause");
}

int main()
{
    char readPath[107];

    strcpy(readPath,"girl.bmp");
    int number;
    do
    {
        system("cls");
        cout<<"\t\t\t图像处理"<<endl;
        cout<<"\t\t\t0、结束"<<endl;
        cout<<"\t\t\t1、读图像(8/24位)"<<endl;
        cout<<"\t\t\t2、写图像(8/24位)"<<endl;
        cout<<"\t\t\t3、显示图像数据(8/24位)"<<endl;
        cout<<"\t\t\t4、计算直方图(8位)"<<endl;
        cout<<"\t\t\t5、对图像进行增量或减暗(8位)"<<endl;
        cout<<"\t\t\t6、图像反色(8/24位)"<<endl;
        cout<<"\t\t\t7、变成灰度图(8/24位)"<<endl;
        cout<<"\t\t\t8、显示调色板(8位)"<<endl;
        cout<<"\t\t\t9、24位彩色图像转换为8位灰度图像(24位)"<<endl;
        cout<<"\t\t\t10、24位彩色图像转换为8位彩色图像(24位)"<<endl;
        cin>>number;
        if(number<0||number>10)
            cin>>number;
        switch (number)
        {
            case 0:exit(0); break;
            case 1:startbmp(readPath); break;
            case 2:exit(0); break;
            case 3:ImageShow(readPath); break;
            case 4:Histogram(readPath); break;
            case 5:BrightDark(readPath); break;
            case 6:Inverse(readPath); break;
            case 7:ConvertGray(readPath); break;
            case 8:palette(readPath); break;
            case 9:TFtoEgray(readPath); break;
            case 10:TFtoEcolor(readPath);break;
            default:        break;
        }
    }while(number!=11);
    system("pause");
    return 0;
}

你可能感兴趣的:(笔记,c++,图像处理)