现在有许多大图像文件需要64位读写函数。下面给出了C语言的代码。
首先读出整个文件,然后在析出里面的参数;
//读出文件到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];
}
析出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);
}