关于怎么用C++读取bmp图片

关于怎么用C++读取bmp图片,第1张

可以看下如下的 *** 作:

1、图片文件是有固定格式的,像BMP图片是文件头+位图的颜色数据。

文件头一般在读取的时候是使用下面的代码:

 BITMAPFILEHEADER fileheader={0} 

    fread(&fileheader,sizeof(fileheader),1,fp) 

    if(fileheader.bfType!=0x4D42)  // 判断是否为BMP图片

    { 

        fclose(fp) 

        return  

    } 

 

    BITMAPINFOHEADER head 

    fread(&head,sizeof(BITMAPINFOHEADER),1,fp)  

    long bmpWidth = head.biWidth     //获取图片的宽

    long bmpHeight = head.biHeight   //获取图片的宽

    WORD biBitCount = head.biBitCount 

    if(biBitCount != 24) // 是否为24位位图袭空则

    { 

        ::AfxMessageBox(_T("请选择24位位图!")) 

        fclose(fp) 

        return  

    }

2、文件读到这里了就要读到位图的颜色数据了,那么在读取前,需要知道数据的大小,这样才能把分配具体大学的缓冲区,之后把数据完整的读取到缓冲区内。

那么计算位图数据的大小一般用下面的代码去做。

int totalSize = (bmpWidth *biBitCount/8+3)/4*4*bmpHeight 

BYTE *pBmpBuf = new BYTE[totalSize]

3、在这些工作做完之后,就使用fread命令直接读取文件内容即可,直到读到文件结束。

整个具体的代码实现如下:

 FILE *fp=NULL 

    int ret = fopen_s(&fp,"D:\\11.bmp","rb") 

    if(fp==0)    

    { 

        return  

    } 

    BITMAPFILEHEADER fileheader={0} 

    fread(&fileheader,sizeof(fileheader),1,fp) 

    if(fileheader.bfType!=0x4D42) 

    { 

        fclose(fp) 

        return  

    } 

 

    BITMAPINFOHEADER head 

    fread(&head,sizeof(BITMAPINFOHEADER),1,fp)  

    long bmpWidth = head.biWidth 

    long bmpHeight = head.biHeight 

    WORD biBitCount = head.biBitCount 

    if(biBitCount != 24) 

    { 

        ::AfxMessageBox(_T("请选择24位位图!")) 

        fclose(fp) 

        return  

    } 

 

  亏羡  int totalSize = (bmpWidth *biBitCount/8+3)/4*4*bmpHeight 

    BYTE *pBmpBuf = new BYTE[totalSize] 

    size_t size = 0 

    while(true) 

    { 

        int iret = fread(&pBmpBuf[size],1,1,fp) 

        if(iret == 0) 

            break 

        size = size + iret 

    } 

    fclose(fp) 

 

    int i,j 

    CClientDC dc(this) 

    int pitch=bmpWidth%4 

    for(i=0i<bmpHeighti++) 

    { 

  拍棚      int realPitch=i*pitch 

        for(j=0j<bmpWidthj++) 

        { 

            dc.SetPixel(j,i,RGB( 

                pBmpBuf[(i*bmpWidth+j)*3+2+realPitch], 

                pBmpBuf[(i*bmpWidth+j)*3+1+realPitch], 

                pBmpBuf[(i*bmpWidth+j)*3+realPitch])) 

        } 

    } 

delete [] pBmpBuf     pBmpBuf = NULL

    return 

给你C++的代码吧呵呵,C的也差不多,稍微修改一下就行了

主要是你要了宏穗慎解BMP文件的结构,就是文件头那里所族简包含的信息,这里用了BITMAPINFOHEADER等现成的结构体来处理,BMP的文件头百度一下就知道的啦,很多资料

#include

"fstream.h"//24bit

bitmap

bool

CBitmapWindow::LoadFile

(char

*bmpFile)

{

FILE

*fp

if((fp=fopen(bmpFile,"rb"))==NULL)

return

false

WORD

bfType

DWORD

bfSize

WORD

bfReserved1

WORD

bfReserved2

DWORD

bfOffBits

BITMAPINFOHEADER

bih

fread(&bfType,sizeof(WORD),1,fp)

if(bfType!=0x4d42)

return

false

fread(&bfSize,sizeof(DWORD),1,fp)

fread(&bfReserved1,sizeof(WORD),1,fp)

fread(&bfReserved2,sizeof(WORD),1,fp)

fread(&bfOffBits,sizeof(DWORD),1,fp)

fread(&bih,sizeof(BITMAPINFOHEADER1),1,fp)

nWidth=bih.biWidth

nHeight=bih.biHeight

if(nWidth

%

4

!=0)

nWidth=nWidth+

(4-nWidth

%

4)

//修正位图宽度值

DWORD

size=nWidth*bih.biBitCount/8*nHeight

arrayColor=new

ZafLogicalColor[nWidth*nHeight]

//

LPSTR

pData=new

char[size]

unsigned

char*

pData=new

unsigned

char[size]

fread(pData,size,1,fp)

int

bmWidthBytes=nWidth*bih.biBitCount

/8

int

bmBitsPixel=bih.biBitCount

int

nBit=bmBitsPixel/8

colorTableBitmap*

clrTableBmp

clrTableBmp=new

colorTableBitmap[nWidth*nHeight]

char

cBit[40]

int

z

for

(int

y=0y<蔽敬nHeighty++)

{

for

(int

x=0x<nWidthx++)

{

z=nHeight-y-1

clrTableBmp[y*nWidth+x].nIndex

=y*nWidth+x

clrTableBmp[y*nWidth+x].iBlue

=pData[x*nBit+z*bmWidthBytes]

clrTableBmp[y*nWidth+x].iGreen

=pData[x*nBit+1+z*bmWidthBytes]

clrTableBmp[y*nWidth+x].iRed=pData[x*nBit+2+z*bmWidthBytes]

sprintf(cBit,",%d:%d:%d:%d",y*nWidth+x,pData[x*nBit+z*bmWidthBytes],

pData[x*nBit+1+z*bmWidthBytes],

pData[x*nBit+2+z*bmWidthBytes])

}

}

delete

[]clrTableBmp

delete

[]pData

fclose(fp)

return

true

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12350968.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存