Как перевернуть ось Y данных пикселей - PullRequest
2 голосов
/ 05 ноября 2019

Я изучаю C ++ и после сбора данных из glMapBuffer в массив я хочу перевернуть данные по оси Y

unsigned char * Data = (unsigned char *)glMapBuffer(GL_PIXEL_PACK_BUFFER, 
    GL_READ_ONLY);

   char firstarray[ length * width * 4] ;
   memcpy( firstarray ,  Data , sizeof( firstarray ));

Теперь я хочу перевернуть данные первого массива по оси Y.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Я пытался это сделать, но я не могу понять математику правильно.

Что ж, было бы намного лучше, если бы вместо этого получилось , что . Вы на самом деле только что создали XY-проблему ...

Соответствующие функции доступа могут выглядеть следующим образом:

unsigned char* getPixel(unsigned int row, unsigend int column)
{
    return array + (row * width + column) * 4;
}

unsigned char* getSubPixel(unsigned int row, unsigend int column, unsigned int color)
{
    return getPixel(row, column) + color;
}

Я хочу перевернуть буфер вось y

Предполагая, что вы хотите создать новое изображение, отраженное по оси x, вы можете просто

std::swap(*getSubPixel(x, y, 0), *getSubPixel(x, width - y, 0))
// same for the other three sub-pixels
// if you decide to return references instead of pointers, you don't need
// to dereference (can skip the asterisks)

для каждого пикселя в половине отстрока (должна быть наполовину, иначе вы бы поменяли местами все значения дважды, что снова привело бы к идентичному изображению) и для каждой строки.

0 голосов
/ 05 ноября 2019

Массив такого размера, выделенный в стеке, скорее всего, будет stack-overflow (каламбур), поэтому вместо него используйте вектор.

Также из * 4 (и размеров), я думаю, выиспользуют массив для хранения изображений, поэтому вы можете создать структуру для хранения самого внутреннего измерения, например:

struct rgba //or color
{ 
    uint8_t red;
    uint8_t green;
    uint8_t blue;
    uint8_t alpha;
};

, а затем создать std :: vector , который содержит цветstruct (rgba в моем примере): std::vector<rgba> img; И вы используете это как:

int length = 1080;
int width = 1920;

std::vector<rgba> img(length * width);

for (int i = 0; i != length; i++)
    for (int j = 0; j != width; j++)
        img[i * width + j] = { 255, 255, 255, 255 };

Или вы можете взглянуть на некоторую библиотеку, которая выполняет обработку изображений, например OpenCV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...