2014-02-04 9 views
1

Я написал следующую функцию для вращения массива пикселей без знака, который содержит изображение RGB на 90 градусов. Проблема, с которой я сталкиваюсь, состоит в том, что повернутый вывод полностью искажен.Поворот пиксельной матрицы на 90 градусов в 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; 
} 
+0

Вы пробовали с небольшим массивом и разработали шаги, которые выполняются вручную? это было бы лучшим способом отладки этого типа проблемы. В любом случае, поскольку вы не знаете, есть ли у вас проблемы с кодом или проблема с реальной логикой, это было бы неплохо для начала. – NiRR

+2

Кажется, что 3 байта используются для одного пикселя. Это отражается только в распределении 'sizeBuffer', но не в другом месте. – neverhoodboy

ответ

3

Заменить линию во внутренней петле-с большей:

for (int i = 0; i < 3; i++) 
    tempBuffer[(x * height + destinationColumn) * 3 + i] = buffer[(offset + x) * 3 + i]; 
+0

Это сделало трюк. Отличный ответ. – PerracoLabs

0

это просто C, добавить приведение к временному типу RgB, чтобы дело компилятора с пиксельной копии и смещения вычисления:

#include <algorithm> 
#include <memory> 

// buffer is interleaved RGB 
void rotate90(unsigned char *buffer, const unsigned int width, const unsigned int height) { 
    struct rgb { unsigned char r_, g_, b_; }; 
    static_assert(sizeof(rgb) == 3, "?"); 

    size_t const count { width * height }; 

    auto source = reinterpret_cast<rgb*>(buffer); 

    auto dest = std::unique_ptr<rgb[]>(new rgb[ count ]); 

    for (size_t y {}, destinationColumn = height - 1; y < height; ++y, --destinationColumn) { 
     size_t offset = y * width; 
     for (size_t x {}; x < width; x++) 
      dest[ (x * height) + destinationColumn ] = source[ offset + x ]; 
    } 

    // Copy rotated pixels 
    std::copy_n(dest.get(), count, source); 
} 

Вы также должны посмотреть здесь идеи о том, как повернуть на 90 градусов без временного хранения и копии размера изображения: http://en.wikipedia.org/wiki/In-place_matrix_transposition

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