БМП к сырой странной проблеме - PullRequest
1 голос
/ 15 сентября 2011

У меня странная проблема с преобразованием стека изображений bmp в необработанный файл (массив без знака). Это код:

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 ]

3 голосов
/ 15 сентября 2011

Ваш код не работает с выравниванием растровых линий. Смотрите член IplImage :: widthStep. Вы не можете скопировать все изображение за один вызов memcpy, если widthStep не равно (размер пикселя в байтах * ширина строки в пикселях).

Растровые изображения Windows выровнены на 32 бита, поэтому изображение 512x512 в порядке, а 426x425 - неверное. Например, если ширина изображения = 11, а каждый пиксель имеет длину 1 байт, фактическая ширина линии (widthStep) будет равна 12 (выравнивание 4 байта).

1 голос
/ 15 сентября 2011

Длина каждой строки в BMP кратна 4, при необходимости оставшиеся байты будут заполнены 0. Вы должны принять это во внимание.

См. Статью Википедии оформат файла BMP для деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...