C的bmp图像文件读写函数

现在有许多大图像文件需要64位读写函数。下面给出了C语言的代码。

  1. 首先读出整个文件,然后在析出里面的参数;

//读出文件到pData中,文件大小为*dwRead。删除pData时用delete。

BYTE* ReadFileNoFormat(TCHAR *FileName, DWORD *dwRead)

{

FILE *fp;

fp = _wfopen(FileName, _T("rb"));

fseek(fp,0,SEEK_END);

_fseeki64(fp,0,SEEK_END);

size_t size = _ftelli64(fp);

rewind(fp);

BYTE* pData = new BYTE[size];

fread(pData,1, size, fp);

*dwRead = size;

fclose (fp);

return pData;

}

2.析出8位图像的各参数和图像像素

BYTE* Image;

int w,h;

void GetBmp8(BYTE* pData)

{

BITMAPFILEHEADER *pbfh = (BITMAPFILEHEADER*)pData;

if(((BITMAPINFO*)(pbfh+1))->bmiHeader.biBitCount!=8)

return;

w = ((BITMAPINFO*)(pbfh+1))->bmiHeader.biWidth;

h = ((BITMAPINFO*)(pbfh+1))->bmiHeader.biHeight;

int pitch;

pitch = ((w+3)/4)*4;

Image = new BYTE[w*h];

BYTE* temp;

temp = (BYTE*)(pbfh)+pbfh->bfOffBits;

int i,j;

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

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

Image[i*w + j] = temp[pitch*i + j];

}

  1. 析出24位图像(RGB)的各参数和图像像素

BYTE* Image;

int w,h;

void ReadRGBBmpFile(BYTE* pData, DWORD dwRead)

{

BITMAPFILEHEADER *pbfh = (BITMAPFILEHEADER*)pData;

w = ((BITMAPINFO*)(pbfh+1))->bmiHeader.biWidth;

h = ((BITMAPINFO*)(pbfh+1))->bmiHeader.biHeight;

int pitch;

pitch = ((w*3+3)/4)*4;

Image = new BYTE[3*w*h];

BYTE* temp;

temp = (BYTE*)(pbfh)+pbfh->bfOffBits;

for(int i=0; i<h; i++)

memcpy(Image+i*3*w, temp + i*pitch, 3*w);

}

void WriteFileNoFormat(TCHAR *FileName, BYTE* pData, DWORD size)

{

//BOOLbSuccess;

//DWORDdwBytesWritten;

//HANDLEhFile;

//hFile = CreateFile ( FileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;

//if (hFile == INVALID_HANDLE_VALUE)

//return FALSE ;

//bSuccess = WriteFile (hFile, ph,Size, &dwBytesWritten, NULL) ;

//CloseHandle (hFile);

//

FILE *fp;

fp = _wfopen(FileName, _T("wb"));

fwrite(pData, 1, size, fp);

fclose (fp);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值