Как визуализировать матрицу состоящую из градации серого с помощью 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 шт):
Попробуйте так:
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_t (у Color есть конструктор, который принимает не отдельно цветовые компоненты 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])));
}
}
