我将一堆bmp图像转换为原始文件(unsigned char数组)时遇到一个奇怪的问题。这是代码:
for(int i=365;i<=385;i++)
{
sprintf(secondname,"C:\\tr\\tr_");
sprintf(secondtemp,"_%04d.bmp",i);
strcat(secondname,secondtemp);
cvSaveImage( secondname,out);
cvReleaseImage( &out );
IplImage* img2 = cvLoadImage( secondname,0);
memcpy(&im[xsize*ysize*(i-365)],img2->imageData,xsize*ysize);
}
outfile=fopen("C:\\Histo_Registration\\a.raw","wb");
fwrite((unsigned char*)im,1,(xsize)*(ysize)*(zsize),outfile);
fclose(outfile);
问题在于,当我加载的图像是例如512x512时,结果原始是正常的。当图像是426x425时,结果原始是奇怪的并不确定是正确的。任何想法?
答案 0 :(得分:3)
您的代码不适用于位图行对齐。请参阅IplImage :: widthStep成员。如果widthStep不等于(像素大小,以字节为单位*行宽,以像素为单位),则无法在一次memcpy调用中复制整个图像。
Windows位图是32位对齐的,这就是512x512图像正常,426x425错误的原因。例如,如果图像宽度= 11,并且每个像素长度为1个字节,则实际线宽(widthStep)将为12(4个字节对齐)。
答案 1 :(得分:1)
BMP中每行的长度是4的倍数,如果需要,剩余的字节将用0填充。您需要考虑到这一点。
有关详细信息,请参阅Wikipedia article about the BMP file format。