如何读入位图(四)

简介: 用C语言读取像素数据: int ReadPixelData(char *filepath,BYTE *imgData) {        BITMAPINFOHEADER bmih;        BITMAPFILEHEADER bmfh;        BYTE *data;    ...

C语言读取像素数据:

int ReadPixelData(char *filepath,BYTE *imgData)

{

       BITMAPINFOHEADER bmih;

       BITMAPFILEHEADER bmfh;

       BYTE *data;

       FILE *fp;

       int n;

       int width;

       int height;

       int bitCount;

       DWORD dwLineBytes;

       //读入文件头

       n=ReadFileHeader(filepath,&bmfh);

       if(n==-1)

       {

              printf("Can not read the file header of the BMP file.\n");

              return -1;

       }

       //读入信息头

       n=ReadInfoHeader(filepath,&bmih);

       if(n==-1)

       {

              printf("Can not read the info header of the BMP file.\n");

              return -1;

       }

       //获得信息头中有用数据

       width=bmih.biWidth;

       height=bmih.biHeight;

       bitCount=bmih.biBitCount;

       dwLineBytes=GetLineBytes(width,bitCount);

       //检查分配的空间是否正确

       if(_msize(imgData)!=(dwLineBytes*height))

       {

              printf("The size you allocate for the pixel data is not right.\n");

              printf("Fittable size: %ld bytes.\n",(dwLineBytes*height));

              printf("Your size: %ld bytes.\n",sizeof(imgData));

              return -1;

       }

       //建立一个中间的变量

       data=(BYTE*)malloc(dwLineBytes*height*sizeof(BYTE));

       if(!data)

       {

              printf("Can not allocate memory for the pixel data.\n");

              return -1;

       }

       //打开文件

       fp=fopen(filepath,"rb");

 

      if(!fp)

       {

              printf("Can not open the file: %s\n",filepath);

              free(data);

              return -1;

       }

      

       if(bitCount==8)

       {//如果为8位位图

              fseek(fp,bmfh.bfOffBits,SEEK_SET);//直接跳到像素数据

       }

       else if(bitCount==24)

       {//与上面重复,可以只写一处

              fseek(fp,bmfh.bfOffBits,SEEK_SET); //直接跳到像素数据

       }

       else

       {

              printf("Only Support: 8 or 24 bits.\n");

              free(data);

              fclose(fp);

              return -1;

       }

       //读入像素数据,大小为高度乘上每行所占字节数

       if(fread(data,dwLineBytes*height*sizeof(BYTE),1,fp)!=1)

       {

              printf("Can not read the pixel data.\n");

              free(data);

              fclose(fp);

              return -1;

       }

       //拷贝读入的数据给imgData

       memcpy(imgData,data,dwLineBytes*height*sizeof(BYTE));

       //释放分配的中间变量的内存

       free(data);

       fclose(fp);//关闭文件

 

       return 0;

}

 

C语言读取位图的像素值:

void PrintPixelData(BYTE *imgData,int width,int height,int bitCount)

{

       int i;

       int j;

       int p;

       DWORD dwLineBytes=GetLineBytes(width,bitCount);

 

       if(bitCount==8)

       {//如果是8位位图

              for(i=0;i<height;i++)

              {

                     for(j=0;j<width;j++)

                     {

                            //读取灰度值

                            p=*(imgData+dwLineBytes*(height-1-i)+j);

                            printf("%d,",p);

                     }

                     printf("\n");

              }

       }

       else if(bitCount==24)

       {//如果是24位位图

              for(i=0;i<height;i++)

              {

                     for(j=0;j<width*3;j++)

                     {

                            printf("(");

                            //读取蓝色分量

                            p=*(imgData+dwLineBytes*(height-1-i)+j);

                            printf("%d,",p);

                            j++;

                            //读取绿色分量

                            p=*(imgData+dwLineBytes*(height-1-i)+j);

                            printf("%d,",p);

                            j++;

                            //读取红色分量

                            p=*(imgData+dwLineBytes*(height-1-i)+j);

                            printf("%d) ",p);

                     }

                     printf("\n");

              }

       }

       else

       {

              printf("Only supported: 8 or 24 bits.\n");

       }

 

}

相关文章
|
7月前
|
存储 机器学习/深度学习 图形学
位图秘境:解析位图表示法及其在文件系统中的应用(一)
位图秘境:解析位图表示法及其在文件系统中的应用
132 0
|
7月前
|
存储 机器学习/深度学习 算法
位图秘境:解析位图表示法及其在文件系统中的应用(二)
位图秘境:解析位图表示法及其在文件系统中的应用
155 0
|
5月前
|
存储 算法 数据挖掘
【C++】位图
【C++】位图
50 1
|
7月前
|
JSON Java 数据处理
Unity 数据读取|(二)多种方式读取文本文件
Unity 数据读取|(二)多种方式读取文本文件
|
7月前
|
存储 算法 C++
【C++入门到精通】位图 | 位图的实现[ C++入门 ]
【C++入门到精通】位图 | 位图的实现[ C++入门 ]
80 0
从文件1中读取数据,修改数据的内容,然后存入文件2中,再从文件2中把数据读取出来显示在屏幕上
从文件1中读取数据,修改数据的内容,然后存入文件2中,再从文件2中把数据读取出来显示在屏幕上
157 0
将数据从文件中读出并排序
将数据从文件中读出并排序
147 0
Halcon把8位图转换为24位图的方法
Halcon把8位图转换为24位图的方法
483 0