在c ++中以任何给定的程度(例如45度)旋转像素阵列

时间:2015-06-05 04:05:32

标签: c++ rotation

我正在尝试用c ++旋转45度的RGB / RGBA图像。 我将图像的像素存储在unsigned char * pBuffer中。 我发现这个代码是90度旋转 -

void rotate90(unsigned char *buffer, const unsigned int width, const unsigned int height)
{
    const unsigned int sizeBuffer = width * height * 3; 
    unsigned char *tempBuffer = new unsigned char[sizeBuffer];

    for (int y = 0, destinationColumn = height - 1; y < height; ++y, --destinationColumn)
    {
        int offset = y * width;

        for (int x = 0; x < width; x++)
        {
            tempBuffer[(x * height) + destinationColumn] = buffer[offset + x];
        }
    }

    // Copy rotated pixels

    memcpy(buffer, tempBuffer, sizeBuffer);
    delete[] tempBuffer;
}

但是我想在任何给定的程度上旋转我的图像以便在C ++中旋转

1 个答案:

答案 0 :(得分:0)

简短回答。你需要实现某种插值。

答案很长。首先要记住,生成的位图将具有不同的大小。例如,如果您有一个100x100像素的图像,45度旋转的图像将具有141x141像素的大小,但只有中心部分将具有原始像素,角落将为空(白色?透明?由您决定)。

关于如何计算中心像素我建议您按如下方式进行:对于目标图片中的每个像素,实现将其映射回原始像素的旋转。这意味着浮点计算,你将得到像32.4; 12.7这样的结果。现在你有几个选择。最简单的是将结果四舍五入到最接近的整数近似并获得该像素。这将给出粒度结果,但在来自案例中可能是可接受的。或者你可以获得最近的4个像素并插入它们。线性插值是一种选择,但会给出一些模糊的结果,其他方案也是可能的(立方体)