使用C旋转BMP图像

时间:2013-11-05 19:59:47

标签: c unix rotation bmp

未压缩的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 =是用户给出的旋转因子

2 个答案:

答案 0 :(得分: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。绘画图片有帮助。

答案 1 :(得分:1)

仅考虑部分代码有点难以推测,但这条线肯定是错误的:

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

如果newCols是新创建的图像的宽度而不是原始图像,则此寻址将是错误的。你不是故意要做以下事情吗?

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