Как визуализировать матрицу состоящую из градации серого с помощью SFML

Eсть матрица 256x256, состоящая из значений double от 0 до 1, где 0 - это серый, а 1 это белый. Пример:

введите сюда описание изображения

Сама матрица в программе задаётся следующим образом:

std::array<std::array<long double, 256>, 256>

Как получить из этого картинку в виде такого: введите сюда описание изображения

Я думал в сторону преобразования этих градаций к виду: 1->255 и 0->128. И использовать следующий код для сохранения картинки, но, видимо, у меня не достаточно знаний, чтобы понять что я делаю не так:

sf::Image image;
image.create(256, 256, sf::Color::Black);
for (size_t x = 0; x < 256; ++x)
{
    for (size_t y = 0; y < 256; ++y)
    {
        image.setPixel(x, y, rgb(arr[x][y], arr[x][y], arr[x][y]));
    }
}

Ответы (1 шт):

Автор решения: isnullxbh

Попробуйте так:

constexpr auto convert(double value) -> std::uint32_t
{
    constexpr double        src_min = 0.0;
    constexpr double        src_max = 1.0;
    constexpr std::uint32_t dst_min = 0;
    constexpr std::uint32_t dst_max = 255;

    const auto normalized = static_cast<std::uint8_t>((dst_max - dst_min)
                          * ((value - src_min) / (src_max - src_min))
                          + dst_min);

    std::uint32_t color {};
    color |= static_cast<std::uint32_t>(normalized) << 8U;
    color |= static_cast<std::uint32_t>(normalized) << 16U;
    color |= static_cast<std::uint32_t>(normalized) << 24U;

    return color;
}

Здесь происходит нормализация значения из отрезка [0.0; 1.0] на отрезок [0; 255]:

const auto normalized = static_cast<std::uint8_t>((dst_max - dst_min)
                      * ((value - src_min) / (src_max - src_min))
                      + dst_min);

А здесь мы получаем новое значение цвета в пространстве RGBA, упакованное в std::uint32_tColor есть конструктор, который принимает не отдельно цветовые компоненты RGB, а целое число, где каждый байт определяет такой компонент). Правда, я мог напутать с порядком, если что, поменяете.

std::uint32_t color {};
color |= static_cast<std::uint32_t>(normalized) << 8U;
color |= static_cast<std::uint32_t>(normalized) << 16U;
color |= static_cast<std::uint32_t>(normalized) << 24U;

Ну а дальше, собственно, Ваш код:

sf::Image image;
image.create(256, 256, sf::Color::Black);
for (size_t x = 0; x < 256; ++x)
{
    for (size_t y = 0; y < 256; ++y)
    {
        image.setPixel(x, y, sf::Color(convert(arr[x][y])));
    }
}
→ Ссылка