我正在尝试用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 ++中旋转
答案 0 :(得分:0)
简短回答。你需要实现某种插值。
答案很长。首先要记住,生成的位图将具有不同的大小。例如,如果您有一个100x100像素的图像,45度旋转的图像将具有141x141像素的大小,但只有中心部分将具有原始像素,角落将为空(白色?透明?由您决定)。
关于如何计算中心像素我建议您按如下方式进行:对于目标图片中的每个像素,实现将其映射回原始像素的旋转。这意味着浮点计算,你将得到像32.4; 12.7这样的结果。现在你有几个选择。最简单的是将结果四舍五入到最接近的整数近似并获得该像素。这将给出粒度结果,但在来自案例中可能是可接受的。或者你可以获得最近的4个像素并插入它们。线性插值是一种选择,但会给出一些模糊的结果,其他方案也是可能的(立方体)