2015-06-05 2 views
1

Я пытаюсь повернуть изображение 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++

+1

Умножение двух комплексных чисел добавляет углы и умножает длины векторов (расстояние от начала координат). Таким образом, если вы рассматриваете точку (x, y) как комплексное число и умножаетесь на комплексное число длины 1 и угол V, то вы будете вращаться на V. Вектор длины 1 при 45 градусах будет равен (1/sqrt (2), 1/sqrt (2)). Как видно из присутствия иррационального числа, вы не получаете полностью перекрывающиеся пиксели. Поэтому, чтобы получить хороший результат, вы идеально подойдете к пикселям по соседству и сделаете средневзвешенное значение. Другая идея - увеличить изображение, повернуть и снова уменьшить масштаб. –

+0

Но вместо того, чтобы делать это явно с помощью кода DIY, почему бы просто не использовать некоторую библиотеку обработки изображений, которая сделает это за вас? OpenCV приходит на ум, а также подсистема Boost для обработки изображений (на базе Intel, IIRC). Вот [пример аффинного преобразования] (http://www.boost.org/doc/libs/1_56_0/libs/gil/example/affine.cpp) с помощью Boost. –

ответ

0

Короткий ответ. Вам нужно реализовать какую-то интерполяцию.

Длинный ответ. Прежде всего, имейте в виду, что итоговое растровое изображение будет иметь разный размер. Например, если у вас есть изображение размером 100x100 пикселей, то повернутое изображение на 45 градусов будет иметь размер 141x141 пикселей, но только центральная часть будет иметь исходные пиксели, углы будут пустыми (белый? Прозрачный? Зависит от вас).

Что касается вычисления центральных пикселей, я предлагаю вам сделать следующее: для каждого пикселя в целевом изображении выполняется поворот, который отображает его обратно в исходном. Это означает вычисления с плавающей запятой, и вы закончите с результатом, равным 32.4; 12.7. Теперь у вас есть несколько вариантов. Простейший результат всего лишь округляет результат до ближайшего целочисленного приближения и получает этот пиксель. Это даст результат, но может быть приемлемым. Или вы можете получить 4 ближайших пикселя и интерполировать их. Линейная интерполяция является опцией, но дает несколько размытый результат, возможны другие схемы (кубический)

Смежные вопросы