【问题标题】:Rotating a BMP image using C使用 C 旋转 BMP 图像
【发布时间】:2013-11-16 20:18:57
【问题描述】:

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

【问题讨论】:

  • 如果你的图片是矩形的,你需要截断它。你确定你这样做正确吗?
  • 我不太确定@jucestain,这就是为什么我要求看看是否有人可以告诉我如何正确地做到这一点。因为它是正方形还是矩形 .bmp 无关紧要,它应该正确旋转它
  • 当您将 2x3 矩形旋转 90(或 -90)度时,它变成了 3x2 矩形...
  • 您应该使用调试器来找出程序段错误的确切位置。

标签: c unix rotation bmp


【解决方案1】:

这是你的问题。你应该乘以 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。画图有帮助。

【讨论】:

  • 完美!这就是我所缺少的。另一个问题,我怎么能把它旋转-90度?有什么想法吗?
  • 我将您的答案标记为正确,因为这就是我程序中的错误。如果您能给我一些关于在旋转因子不是 90(例如 -90 或 180)时如何旋转它的见解,我将不胜感激。非常感谢。
  • 我更新了答案以包含 -90 和 180 旋转的解决方案。
【解决方案2】:

仅给出部分代码有点难以推测,但这一行肯定看起来是错误的:

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

如果newCols 是新创建图像的宽度,而不是原始图像的宽度,则此寻址将是错误的。您不是要执行以下操作吗?

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

【讨论】:

  • 好的,我更新了我的代码以反映这一点,但我仍然遇到这样的问题:当我尝试旋转一个不是正方形的 .bmp 文件(意味着宽度和高度相等)时,它给了我一个 seg 错误.
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2017-06-22
  • 2013-10-29
  • 2019-12-03
  • 2019-10-18
  • 1970-01-01
  • 2022-07-11
相关资源
最近更新 更多