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