Bmp到原始奇怪的问题

时间:2011-09-15 08:32:09

标签: c++ image-processing opencv

我将一堆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时,结果原始是奇怪的并不确定是正确的。任何想法?

2 个答案:

答案 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