2

未压缩的 24 位 .bmp 文件

给定旋转倍数 90,我需要旋转 .bmp 文件。例如,我有一张图像,我给定了 +90 或 -90 的旋转因子。我的图像将根据旋转因子向左或向右旋转 90 度。当文件的尺寸相等时,我的程序可以正常工作,这意味着高度和宽度相等,但是当我使用不是正方形的图像时,我会遇到 seg 错误。

这是我到目前为止的代码。

if(rotation == 90 || rotation == -270 )
{
    /* 90 = -270 */
    for(row = 0; row < rows; row++)
    {
        for(col = 0; col < cols; col++ )
        {
            PIXEL* o = original+ (row*cols) + col;
            PIXEL* n = (*new)+((cols-col-1)*cols) + row;
            *n = *o;
        }
    }
    *newcols = cols;
    *newrows = rows;

此方法的标头是:

int rotate(PIXEL* original, int rows, int cols, int rotation,
   PIXEL** new, int* newrows, int* newcols)

其中 PIXEL* original 包含原始 .bmp 文件

通过调用读取 .bmp 文件的方法获得行和列

rotation = 是用户给定的旋转因子

4

2 回答 2

2

这是你的问题。你应该乘以rows而不是cols在这里:

PIXEL* n = (*new)+((cols-col-1)*rows) + row;

您想乘以新图像中行的宽度,这与原始图像中的行数相同。

此外,您应该在这里交换行和列:

*newcols = rows;
*newrows = cols;

旋转 -90:

PIXEL* n = (*new)+(col*rows) + (rows-row-1);
*newcols = rows;
*newrows = cols;

旋转 180:

PIXEL* n = (*new)+((rows-row-1)*cols) + (cols-col-1);
*newcols = cols;
*newrows = rows;

一般来说,公式是:

PIXEL* n = (*new)+(newrow*newcols) + newcol;

您只需要弄清楚如何从先前未旋转的 BMP 中确定 newrow、newcols 和 newcol。画图有帮助。

于 2013-11-05T21:41:40.937 回答
1

It is a bit hard to speculate given only part of the code, but this line certainly seems wrong:

PIXEL* o = original+ (row*newCols) + col;

If newCols is the width of the newly created image as opposed to the original image, then this addressing would be wrong. Don't you mean to be doing the following instead?

PIXEL* o = original+ (row*cols) + col;
于 2013-11-05T20:26:17.603 回答