Я пытаюсь повернуть изображение RGB/RGBA в 45 градусов в C++. У меня есть пиксели изображения, сохраненные в unsigned char * pBuffer. Я нашел этот код для вращения 90 градусов -вращать пиксельную матрицу в любой заданной степени (например, 45 градусов) в C++
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++
Умножение двух комплексных чисел добавляет углы и умножает длины векторов (расстояние от начала координат). Таким образом, если вы рассматриваете точку (x, y) как комплексное число и умножаетесь на комплексное число длины 1 и угол V, то вы будете вращаться на V. Вектор длины 1 при 45 градусах будет равен (1/sqrt (2), 1/sqrt (2)). Как видно из присутствия иррационального числа, вы не получаете полностью перекрывающиеся пиксели. Поэтому, чтобы получить хороший результат, вы идеально подойдете к пикселям по соседству и сделаете средневзвешенное значение. Другая идея - увеличить изображение, повернуть и снова уменьшить масштаб. –
Но вместо того, чтобы делать это явно с помощью кода DIY, почему бы просто не использовать некоторую библиотеку обработки изображений, которая сделает это за вас? OpenCV приходит на ум, а также подсистема Boost для обработки изображений (на базе Intel, IIRC). Вот [пример аффинного преобразования] (http://www.boost.org/doc/libs/1_56_0/libs/gil/example/affine.cpp) с помощью Boost. –