请高手赐教C语言图片文件头文件格式的解释,该怎么处理
请高手赐教C语言图片文件头文件格式的解释
FILE *fp;
unsigned char *pRGB,*pr,*pg,*pb,*pR,*pG,*pB;
int j,i;
unsigned int *pk;
pRGB=(unsigned char *)headerImage;//为unsigned char headerImage[54]
for ( i=0;i <54;i++,pRGB++ ) (*pRGB)=0;
pRGB=(unsigned char *)headerImage;
(*pRGB)=0x42; pRGB++; // BM
(*pRGB)=0x4d; pRGB++;
pRGB+=2;
pk=(unsigned int *)pRGB; (*pk)=14+40+180*144*3; // size
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // reserved
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=54; // image offset
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=40; // struct size
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=720; // width
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=576; // height
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0x180001; // Planes & BitCount
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // Compression
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=720*576*3; // image size
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=3780; // x pixels/m
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=3780; // y pixels/m
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // color used
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // important color
if ( fp=fopen( "video.bmp ", "wb+ ") )
{
printf( "Create a file named Video.bmp\n ");
pRGB=headerImage;/***************************/
fwrite(pRGB,2,1,fp);/***************************/
fwrite(pRGB+4,52,1,fp);/***************************/
pR=m_dbTargetImageR+720*575;
pG=m_dbTargetImageG+720*575;
pB=m_dbTargetImageB+720*575;
printf( "Saving image data...\n ");
for ( j=0;j <576;j++ )
{
pr=pR; pg=pG; pb=pB;
for ( i=0;i <720;i++,pr++,pg++,pb++ )
{
fwrite(pb,1,1,fp);
fwrite(pg,1,1,fp);
fwrite(pr,1,1,fp);
}
pR-=720;
pG-=720;
pB-=720;
if ( j%57==0 )
printf( " completed %d%%\n ",j/57*10);
}
fclose(fp);
printf( "Finished.\n ");
}
此段代码主要就是把内存中的m_dbTargetImageR,m_dbTargetImageG
m_dbTargetImageB这几个首地址的数组的内容写到文件中.
我的问题是在代码中后面用*号注明的那段代码,headerImage这个数组的大小明明是54,为什么在第一个数据块输出函数fwrite(pRGB,2,1,fp);(其中pRGB指向headerImage的首地址,)执行后,第二个fwrite(pRGB+4,52,1,fp);中的地址为什么要加4后,还要输出52个到fp中,那不就地址越界了吗?我的理解是在执行完第一个数据块输出函数fwrite(pRGB,2,1,fp);后应该执行数据块输出函数fwrite(pRGB+2,52,1,fp);这才对.可实验表明我是错的,请高手指出我的原因!!
------解决方案--------------------
(*pRGB)=0x42; pRGB++; // BM
(*pRGB)=0x4d; pRGB++;
pRGB+=2; // 这里多加了2 后面+4,可能是为了跳过这个+2,但
程序整体怎么感觉还有问题,前面的代码是什么
FILE *fp;
unsigned char *pRGB,*pr,*pg,*pb,*pR,*pG,*pB;
int j,i;
unsigned int *pk;
pRGB=(unsigned char *)headerImage;//为unsigned char headerImage[54]
for ( i=0;i <54;i++,pRGB++ ) (*pRGB)=0;
pRGB=(unsigned char *)headerImage;
(*pRGB)=0x42; pRGB++; // BM
(*pRGB)=0x4d; pRGB++;
pRGB+=2;
pk=(unsigned int *)pRGB; (*pk)=14+40+180*144*3; // size
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // reserved
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=54; // image offset
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=40; // struct size
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=720; // width
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=576; // height
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0x180001; // Planes & BitCount
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // Compression
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=720*576*3; // image size
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=3780; // x pixels/m
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=3780; // y pixels/m
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // color used
pRGB+=4;
pk=(unsigned int *)pRGB; (*pk)=0; // important color
if ( fp=fopen( "video.bmp ", "wb+ ") )
{
printf( "Create a file named Video.bmp\n ");
pRGB=headerImage;/***************************/
fwrite(pRGB,2,1,fp);/***************************/
fwrite(pRGB+4,52,1,fp);/***************************/
pR=m_dbTargetImageR+720*575;
pG=m_dbTargetImageG+720*575;
pB=m_dbTargetImageB+720*575;
printf( "Saving image data...\n ");
for ( j=0;j <576;j++ )
{
pr=pR; pg=pG; pb=pB;
for ( i=0;i <720;i++,pr++,pg++,pb++ )
{
fwrite(pb,1,1,fp);
fwrite(pg,1,1,fp);
fwrite(pr,1,1,fp);
}
pR-=720;
pG-=720;
pB-=720;
if ( j%57==0 )
printf( " completed %d%%\n ",j/57*10);
}
fclose(fp);
printf( "Finished.\n ");
}
此段代码主要就是把内存中的m_dbTargetImageR,m_dbTargetImageG
m_dbTargetImageB这几个首地址的数组的内容写到文件中.
我的问题是在代码中后面用*号注明的那段代码,headerImage这个数组的大小明明是54,为什么在第一个数据块输出函数fwrite(pRGB,2,1,fp);(其中pRGB指向headerImage的首地址,)执行后,第二个fwrite(pRGB+4,52,1,fp);中的地址为什么要加4后,还要输出52个到fp中,那不就地址越界了吗?我的理解是在执行完第一个数据块输出函数fwrite(pRGB,2,1,fp);后应该执行数据块输出函数fwrite(pRGB+2,52,1,fp);这才对.可实验表明我是错的,请高手指出我的原因!!
------解决方案--------------------
(*pRGB)=0x42; pRGB++; // BM
(*pRGB)=0x4d; pRGB++;
pRGB+=2; // 这里多加了2 后面+4,可能是为了跳过这个+2,但
程序整体怎么感觉还有问题,前面的代码是什么