
可以看下如下的 *** 作:
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*bmpHeightBYTE *pBmpBuf = new BYTE[totalSize]
3、在这些工作做完之后,就使用fread命令直接读取文件内容即可,直到读到文件结束。
整个具体的代码实现如下:
FILE *fp=NULLint 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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)