Генерация градиента с помощью CImg и динамического массива - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь сгенерировать png с другим разрешением. Но если я использую динамический массив, он генерирует только серую область. Это источник моего кода ( C ++ 16-битное градиентное изображение в градациях серого из 2D-массива )

void generate_horizontal_gradient(char fileName[], int width, int height, int offset, bool direction)
{
    unsigned short** buffer = new unsigned short* [height];
    for (int i = 0; i < height; i++)
    {
    buffer[i] = new unsigned short[width];
    }

    for (int i = 0; i < height; i++)
    {
        unsigned short temp_data = 65535;
        if (direction == true) {
            for (int j = width; j > 0; j--)
            {
                buffer[i][j] = temp_data;
                if (j < width - offset)
                {
                    temp_data -= 65535 / (width - offset);
                }
            }
        }
        else
        {
            for (int j = 0; j < width; j++)
            {
                buffer[i][j] = temp_data;
                if (j > offset)
                {
                    temp_data -= 65535 / (width - offset);
                }
            }
        }
    }
    auto hold_arr = (unsigned short*) &buffer[0][0];
    cimg_library::CImg<unsigned short> img(hold_arr, width, height);
    img.save_png(fileName);
}

1 Ответ

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

Видимо, я что-то еще не понимаю в двумерных массивах. Решил проблему через одномерный массив:

void generate_horizontal_gradient(char fileName[], int width, int height, int offset, bool direction)
{   
unsigned short* buffer = new unsigned short[height * width];

//Add values to array.
for (int i = 0; i < height; i++)
{
    unsigned short temp_data = 65535;
    if (direction == true) {
        for (int j = width; j > 0; j--)
        {
            buffer[i* width +j] = temp_data;
            if (j < width - offset) temp_data -= 65535 / (width - offset);          
        }
    }
    else
    {
        for (int j = 0; j < width; j++)
        {
            buffer[i * width + j] = temp_data;
            if (j > offset) temp_data -= 65535 / (width - offset);
        }
    }
}

unsigned short* hold_arr = (unsigned short*)& buffer[0*0];
cimg_library::CImg<unsigned short> img(buffer, width, height);
img.save_png(fileName);
}
...