如何用c++语言实现对bmp二值图像数据的访问?

假设内存中位图数据的指针为pBmpBuf,一行像素所占的字节数为lineByte(4的倍数)那么,对于biBitCount=8的图像,第i行第j列的像素指针(所在的存储空间的位置)为pBmpBuf+i*lineByte+j,对于biBitCount=24的图像,pBmpBuf+i*lineByte+j*3+0,pBmpBuf+i*lineByte+j*3+1,pBmpBuf+i*lineByte+j*3+2分别对应该像素的B、G、R颜色分量。由这些,可以实现对8位和24位图像的数据访问,对图像进行点运算处理,但是对于1位的二值图像呢?该如何访问它的像素?

1.图片也是属于文件类型的一种,图片属于二进制文件。使用fopen函数的二进制模式“rb”就可以打开。

2.例程:

    #include <stdlib.h>
    #include <stdio.h>
    int main ()
    {
        FILE * fpPhoto, * fpText, * fpTarget ;
        int     iRead ;
        char    szBuf[100] ;
          
        printf ("请输入第一个文件名(bmp):\n") ;
        gets (szBuf) ;
        fpPhoto = fopen (szBuf, "rb") ;
        printf ("请输入第二个文件名(txt):\n") ;
        gets (szBuf) ;
        fpText = fopen (szBuf, "rb") ;
        printf ("请输入目的文件名(bmp):\n") ;
        gets (szBuf) ;
        fpTarget = fopen (szBuf, "wb") ;
      
        if (!fpPhoto || !fpText || !fpTarget)
        {
            printf ("打开文件失败!\n") ;
            system("pause") ;
            return -1 ;
        }
      
        while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpPhoto)) > 0)
            fwrite (szBuf, 1, iRead, fpTarget) ;
        while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpText)) > 0)
            fwrite (szBuf, 1, iRead, fpTarget) ;
      
        fclose (fpPhoto) ;
        fclose (fpText) ;
        fclose (fpTarget) ;
        return 0 ;
    }

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-27
bmp二值图也是用灰度图表示的,不过只有0和255两个值而已,可以用8位访问方式。追问

谢谢,但是,我遇到的就是一个不是用灰度图表示的bmp二值图、、它的biBitCount=1,不知如何处理

第2个回答  2013-07-27
对于1位的二值图像呢
读一个字节 转8个 像素
不管位图文件怎样,最后显示用的数据都是32位的
所以位图文件读进来后 都要转换成32位的追问

要如何转呢?

追答

读一个字节 转8个 像素
byte >> 7 取第一位
(byte >7 取第二位
......
以此类推

本回答被提问者采纳

如何用c++语言实现对bmp二值图像数据的访问?
1.图片也是属于文件类型的一种,图片属于二进制文件。使用fopen函数的二进制模式“rb”就可以打开。2.例程:include <stdlib.h> #include <stdio.h> int main () { FILE * fpPhoto, * fpText, * fpTarget ; int iRead ; char szBuf[100] ; printf ("请输入第...

用C++完成一个程序,能读取BMP图象文件...
int lineByte=(width * biBitCount\/8+3)\/4*4;\/\/以二进制写的方式打开文件 FILE *fp=fopen(bmpName,"wb");if(fp==0) return 0;\/\/申请位图文件头结构变量,填写文件头信息 BITMAPFILEHEADER fileHead;fileHead.bfType = 0x4D42;\/\/bmp类型 \/\/bfSize是图像文件4个组成部分之和 fileHead.bfSize=...

关于怎么用C++读取bmp图片
1、图片文件是有固定格式的,像BMP图片是文件头+位图的颜色数据。文件头一般在读取的时候是使用下面的代码:BITMAPFILEHEADER fileheader={0}; fread(&fileheader,sizeof(fileheader),1,fp); if(fileheader.bfType!=0x4D42) \/\/ 判断是否为BMP图片 { fclose(fp); return ; } ...

用C++ 读取bmp信息,求代码
char *bmpName;\/\/图像路径 int width;\/\/宽 int height;\/\/图像的高 int biBitCount;\/\/图像类型,每像素位数 int lineByte;int datasize;BITMAPINFOHEADER head;BITMAPFILEHEADER file;RGBQUAD color[2];}bmpMaze;int readBmp(bmpMaze *maze){ int i=0;FILE *fp=fopen(maze->bmpName,"rb");if(...

怎么用Visual C++读取BMP格式图像?
Bitmap文件格式...BITMAPFILEHEADER BITMAPINFOHEADER 调色板 位图数据 如果定义高度为正数则数据从下向上存储,否则从上向下。每行的数据要4字节对齐。

如何用VISUAL C++打开BMP图像?求源代码
MFC的话可以用CBITMAP类来处理bmp,读取的话用win32 api loadimage();平滑不理解,平滑移动?简单点设置个后台缓冲,俗称double buffer 二值化的话先把彩色RGB的转化为黑白,比较常用的是转成亮度 Luminance=0.3 R + 0.59 G + 0.11 B,亮度的范围是0-255,把RBG都设置成亮度值,显示出来的就...

请高手指点如何用C语言读一个bmp格式的图像
WORD bReserved2; \/* 保留值,必须设置为0 *\/ DWORD bOffset; \/* 文件头的最后到图像数据位开始的偏移量 *\/ } BMPFILEHEADER;\/*位图信息头*\/ typedef struct BMP_INFO { DWORD bInfoSize; \/* 信息头的大小 *\/ DWORD bWidth; \/* 图像的宽度 *\/ DWORD bHeight...

c\/c++ winsock 如何发送和接收图片bmp格式文件
1。发送连接申请到服务端 2。使用fopen打开要发送的BMP文件 3。使用fread函数读取数据存入变量中 4。使用函数send来将变量中内容发送到服务端 服务端:1。接受客户端连接申请 2。使用fopen函数创建一个BMP文件 3。使用函数recv来接收传送过来的数据存入变量中 4。使用fread函数将变量中的数据写入刚刚创建...

如何用VISUAL C++打开BMP图像?求源代码
你首先需要了解bmp文件的文件结构。1)前面14个字节是 文件头 ——c++中有一个结构体 bitmapfileheader 与其对应 2)接下来的40个字节 是位图信息头 ——c++中有一个结构体 bitmapinfoheader 与其对应 3)再接下来就是调色板——字节数和你所用的文件的颜色总数有关,例如,256色,就有256条记录;...

如何使用C++的读取文件流读取一个24位真彩色的BMP文件到一个数组当中...
1.读取文件。使用System.IO命名空间加的一个类库。读取一个文件可以按文本的方式读取,也可以按二进制流的方式读取,按二进制流的方式读取,返回的结果就是一个字节数组。byte[] bmps = System.IO.File.ReadAllBytes("a.bmp");2.所谓路径。路径是文件系统的一个概念,对于一个Windows文件系统来说,...

相似回答