35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578

Сохранение полученного на экране изображения на диск

16.05.2025, 12:14. Показов 2103. Ответов 16

Студворк — интернет-сервис помощи студентам
В процессе освоения на VS2019 методики вывода результатов расчета на экран в онлайн режиме столкнулся с трудностями, связанными с нежеланием использовать элементы ПИТОНА. Используя библиотеку matplotcppcppp большинства трудностей можно было бы избежать.
При отказе от ПИТОНА надо выбрать основную библиотеку.
Выбор широкий. Сначала попробовал использовать Gnuplot, который ранее широко использовался при работе в ЛИНЮКС, но не понравилась необходимость создавать вспомогательные файлы инструкций для Gnuplot.
Наиболее легrо оказалось установить. используя vcpkg SFML.
Попытки с Qt6 и VTK завязли в методике подключения.
Итак SFML: рисование освоил. команды типа windows.draw(object) позволяют рисовать и линии и прямоугольники разной геометрии. но при попытках сохранить полученное на диск начались танцы с бубнами.
ИИ в лице Gpto3-mini и DeepSeek с Syntha.ai на подхвате помочь мне с этой проблемой не смогли.
Вывод, чтобы сохранять на диск, оставаясь в SFML надо изменить метод рисования и рисовать не объекты, а их пиксельные образы. Да так можно, но программа делается не читаемой.
Поэтому вопрос: почему создав рисунок на экране нельзя его сохранить?
Во-первых этому мешает основной цикл, в течение которого windows открыт. А после закрытия, где образ? SFML готовясь сохранить строит соответствующий imag или texture. Как избежать этого? Хочется по-простому, написать команду save и все.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.05.2025, 12:14
Ответы с готовыми решениями:

Найти сумму двух чисел, полученных в результате сравнения чисел, полученных в результате вычисления выражений
Даны действительные числа a, b, c. Найти: max(a+b, b+c) + min(a+c, b)

Загрузка изображения в Image с сохранении соотношения сторон изображения
загрузка изображения в Image(с фиксированным размером) при этом изображение должно сохранить...

Сохранение полученного графика из чарт в картинку
Ребят подскажите плиз как сохранить полученный график в картинку. Я так понял подключить...

16
 Аватар для SmallEvil
3929 / 2836 / 792
Регистрация: 29.06.2020
Сообщений: 10,409
17.05.2025, 21:04
Цитата Сообщение от VAF34 Посмотреть сообщение
Поэтому вопрос: почему создав рисунок на экране нельзя его сохранить?
Можно.
Читайте документацию и форумы а не негросетки.
C++
1
2
3
4
5
6
7
sf::Texture texture;
texture.create(render_window.getSize().x, render_window.getSize().y);
texture.update(render_window);
if (texture.copyToImage().saveToFile(filename))
{
    std::cout << "screenshot saved to " << filename << std::endl;
}
Добавлено через 1 минуту
Цитата Сообщение от VAF34 Посмотреть сообщение
SFML готовясь сохранить строит соответствующий imag или texture. Как избежать этого?
Зачем этого избегать?
Это естественный процесс.
1
35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578
18.05.2025, 07:43  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
if (texture.copyToImage().saveToFile(filena me))
{
    std::cout << "screenshot saved to " << filename << std::endl;
}
Это и было описано как сохранение png из texture. Но рисовать легко все что угодно, а включить рисунок в texture не всегда получается. Так что вопрос остался. Как сохранять рисунок, не используя texture?
0
397 / 33 / 7
Регистрация: 09.01.2019
Сообщений: 141
18.05.2025, 09:20
Цитата Сообщение от VAF34 Посмотреть сообщение
Как сохранять рисунок, не используя texture?
Если имеется в виду сохранить изображение как скриншот - то не используя текстуру - никак. Как правильно написал SmallEvil, Вам надо выгрузить массив пикселей с видеокарты в оперативную память, а потом и на диск.

Вообще непонятно, в чём проблема - Вам бы для начала научиться яснее выражать мысли, исходный вопрос представлен потоком сознания, как будто пытались нажать все кнопки сразу.

Во-первых этому мешает основной цикл, в течение которого windows открыт.
Каким же образом?

А после закрытия, где образ?
Там, где указали путь для сохранения файла

Хочется по-простому, написать команду save и все.
C++
1
if (texture.copyToImage().saveToFile(filename)) { ... }
А это что, по Вашему?
0
35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578
18.05.2025, 13:05  [ТС]
Цитата Сообщение от EugeneNN Посмотреть сообщение
Вам бы для начала научиться яснее выражать мысли
Если вам было что-то непонятно, то задали бы вопрос, как многие и делают. Из вашего текста, отвечая на ваши замечания, решения я не вижу. Если вашего опыта достаточно, изобразите программку, рисующую линию задаваемой толщины и сохраняющую это в png. У меня с помощью DeepSeek и GPT-mini это не получается.
0
 Аватар для SmallEvil
3929 / 2836 / 792
Регистрация: 29.06.2020
Сообщений: 10,409
18.05.2025, 17:23
Я дуб дерево в SFML, но без всяких нейронок(SFML 3.0.0) / MSVC 2022 / x64:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <SFML/Graphics.hpp>
#include "windows.h"
 
 
int main()
{
    sf::RenderWindow window{ sf::VideoMode({400u, 400u}), "SFML Save To File (F12)", sf::Style::Titlebar | sf::Style::Close };
    sf::CircleShape shape(200.f);
    shape.setFillColor(sf::Color::Blue);
 
 
    while (window.isOpen())
    {
        window.clear();
        window.draw(shape);
        window.display();
        while (const std::optional event = window.pollEvent())
        {
            if (event->is<sf::Event::Closed>())
            {
                window.close();
                break;
            }
 
            if (const auto* keyPress = event->getIf<sf::Event::KeyPressed>())
            {
                 // When the enter key is pressed, switch to the next handler type
                if (keyPress->code == sf::Keyboard::Key::F12)
                {
                    sf::Texture texture;
                    texture.resize({ window.getSize().x, window.getSize().y });
                    texture.update(window);
                    if (texture.copyToImage().saveToFile("picture.jpg"))
                    {
                        MessageBox(nullptr, L"File Saved", L"Info", MB_OK);
                    }
                }
            }
        }
    }
}
Вложения
Тип файла: zip SFML_ToFile_x64.zip (121.7 Кб, 0 просмотров)
0
 Аватар для SmallEvil
3929 / 2836 / 792
Регистрация: 29.06.2020
Сообщений: 10,409
18.05.2025, 17:27
C++
1
bool sf::Image::saveToFile  (   const std::string &     filename    )   const
Save the image to a file on disk.

The format of the image is automatically deduced from the extension. The supported image formats are bmp, png, tga and jpg. The destination file is overwritten if it already exists. This function fails if the image is empty.

Parameters
filename Path of the file to save
Returns
True if saving was successful
Enjoy.
0
397 / 33 / 7
Регистрация: 09.01.2019
Сообщений: 141
18.05.2025, 18:17
Цитата Сообщение от VAF34 Посмотреть сообщение
У меня с помощью DeepSeek и GPT-mini это не получается.
Попросил дипсик написать такой код, скопировав твой промпт:
изобразите программку, рисующую линию задаваемой толщины и сохраняющую это в png
Результат:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <SFML/Graphics.hpp>
#include <cmath>
#include <iostream>
 
// Функция для рисования линии с заданной толщиной
void drawThickLine(sf::RenderTexture& renderTexture, const sf::Vector2f& start, const sf::Vector2f& end, float thickness, const sf::Color& color) 
{
    sf::Vector2f direction = end - start;
    float length = std::sqrt(direction.x * direction.x + direction.y * direction.y);
    direction /= length; // Нормализуем вектор направления
 
    // Создаём прямоугольник (линию с толщиной)
    sf::RectangleShape line(sf::Vector2f(length, thickness));
    line.setPosition(start);
    line.setFillColor(color);
 
    // Поворачиваем прямоугольник в направлении линии
    float angle = std::atan2(direction.y, direction.x) * 180.0f / 3.14159265f;
    line.setRotation(angle);
 
    renderTexture.draw(line);
}
 
int main() 
{
    // Создаём текстуру для рисования
    sf::RenderTexture renderTexture;
    if (!renderTexture.create(800, 600)) {
        std::cerr << "Не удалось создать текстуру!" << std::endl;
        return -1;
    }
    renderTexture.clear(sf::Color::White); // Белый фон
 
    // Рисуем линию с заданной толщиной
    sf::Vector2f start(100.0f, 100.0f);
    sf::Vector2f end(700.0f, 500.0f);
    float thickness = 10.0f; // Толщина линии (пиксели)
    sf::Color lineColor = sf::Color::Red;
 
    drawThickLine(renderTexture, start, end, thickness, lineColor);
 
    // Сохраняем в PNG
    sf::Image outputImage = renderTexture.getTexture().copyToImage();
    if (!outputImage.saveToFile("line.png")) {
        std::cerr << "Не удалось сохранить изображение!" << std::endl;
        return -1;
    }
 
    std::cout << "Линия сохранена в line.png" << std::endl;
    return 0;
}
Собрал с SFML 2.6.2, всё сразу взлетело, сгенерировав файлик png с линией заданного цвета рядом с экзешником.
Дополнительно диксик дал советы по настройкам цвета линий, их количества, размера изображений:

C++
1
sf::Color lineColor = sf::Color(0, 0, 255); // Синяя линия
C++
1
renderTexture.create(1920, 1080); // Full HD
Несколько линий:
Просто вызовите drawThickLine() несколько раз с разными координатами.

Не по теме : жесть какая, нынешние студентики не то что в элементарной документации не могут разобраться, уже и нейросеткам вопрос не умеют формулировать...
Миниатюры
Сохранение полученного на экране изображения на диск  
1
18.05.2025, 20:13

Не по теме:

Цитата Сообщение от EugeneNN Посмотреть сообщение
sf::Color lineColor = sf::Color(0, 0, 255); // Синяя линия
Вспомнилось:
Семь красных линий

0
35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578
19.05.2025, 12:13  [ТС]
Цитата Сообщение от EugeneNN Посмотреть сообщение
в элементарной документации не могут разобраться,
Судя по всему vcpkg поставил мне какую-то странную версию SFML в vcpkg она обозначается как 3.0.0#1. Поэтому получаемые из интернета или от ИИ тексты приходится править. Это относится к дополнительным {} и главное к while (window.isOpen()) и некоторым другим фрагментам.
Так присланная EugeneNN программа корректируется до
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <SFML/Graphics.hpp>
#include <cmath>
#include <iostream>
 
// Функция для рисования линии с заданной толщиной
void drawThickLine(sf::RenderTexture& renderTexture, const sf::Vector2f& start, const sf::Vector2f& end, float thickness, const sf::Color& color) 
{
    sf::Vector2f direction = end - start;
    float length = std::sqrt(direction.x * direction.x + direction.y * direction.y);
    direction /= length; // Нормализуем вектор направления
 
    // Создаём прямоугольник (линию с толщиной)
    sf::RectangleShape line(sf::Vector2f(length, thickness));
    line.setPosition(start);
    line.setFillColor(color);
 
    // Поворачиваем прямоугольник в направлении линии
    float angle = std::atan2(direction.y, direction.x) * 180.0f / 3.14159265f;
  //  line.setRotation(angle);
 
    renderTexture.draw(line);
}
 
int main() 
{
    // Создаём текстуру для рисования
    sf::RenderTexture renderTexture({ 800, 600 });
 /*   if (!renderTexture.create({800, 600})) {
        std::cerr << "Не удалось создать текстуру!" << std::endl;
        return -1;
    } */
    renderTexture.clear(sf::Color::White); // Белый фон
 
    // Рисуем линию с заданной толщиной
    sf::Vector2f start(100.0f, 100.0f);
    sf::Vector2f end(700.0f, 500.0f);
    float thickness = 10.0f; // Толщина линии (пиксели)
    sf::Color lineColor = sf::Color::Red;
 
    drawThickLine(renderTexture, start, end, thickness, lineColor);
 
    // Сохраняем в PNG
    sf::Image outputImage = renderTexture.getTexture().copyToImage();
    if (!outputImage.saveToFile("lineE.png")) {
        std::cerr << "Не удалось сохранить изображение!" << std::endl;
        return -1;
    }
 
    std::cout << "Линия сохранена в line.png" << std::endl;
    return 0;
}
в этом виде она проходит компиляцию и при запуске без отладки сохраняет png с линией, но окна с изображением не получается. Еще одна деталь диалекта : angle я не нашел правильного текста для работы с углами и цветом RGB. В приведенном примере изменение угла выключено.
0
19.05.2025, 14:56

Не по теме:

VAF34, да, понимаю, в 90 лет только с нейронками и общаться...

0
35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578
19.05.2025, 15:26  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Не по теме:
Спасибо всем за помощь. У менz работала программа с библиотекой Gnuplot все рисовала, спасала и была на экране кнопка режима спасения, позволяющая выбрать вид спасаемого png или jpgю
Теперь у меня похожая ситуация и с библиотекой SFML, тоже рисует, спасает, но кнопки выбора режима нет.
И общий недостаток, от которого я хотел избавиться - это рисование из подготовленных файлов gl или png.
0
397 / 33 / 7
Регистрация: 09.01.2019
Сообщений: 141
20.05.2025, 08:54
Цитата Сообщение от VAF34 Посмотреть сообщение
Судя по всему vcpkg поставил мне какую-то странную версию SFML в vcpkg она обозначается как 3.0.0#1
Скачай 2.6.2 и настрой проект, на сайте SFML есть пошаговая документация для любой версии SFML

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

И общий недостаток, от которого я хотел избавиться - это рисование из подготовленных файлов gl или png.
Посмотри этот пример (текстурка для фона в комплекте):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <SFML/Graphics.hpp>
 
sf::VideoMode screen(600, 480);
 
int main()
{
    sf::RenderWindow window(screen, "test!");
    window.setVerticalSyncEnabled(1);
 
    sf::Texture t1;
    t1.loadFromFile("res/background.jpg");
    sf::Sprite s1(t1);
 
    sf::CircleShape s2(3);
    s2.setOrigin(s2.getLocalBounds().width / 2, s2.getLocalBounds().height / 2);
    s2.setFillColor(sf::Color::Green);
 
    sf::RenderTexture rt;
    rt.create(t1.getSize().x, t1.getSize().y);
 
    sf::Sprite s3(rt.getTexture());
 
    rt.draw(s1);
 
    while (window.isOpen())
    {
        sf::Event event;
 
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
        sf::Vector2f cursor = (sf::Vector2f)sf::Mouse::getPosition(window);
        s2.setPosition(cursor);
 
        rt.draw(s2);
        rt.display();       
 
        window.clear();
        window.draw(s3);
        window.display();
    }
 
    return 0;
}
Миниатюры
Сохранение полученного на экране изображения на диск  
0
35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578
20.05.2025, 09:51  [ТС]
Цитата Сообщение от EugeneNN Посмотреть сообщение
текстурка для фона в комплекте):
Не нашел background.jpg
0
397 / 33 / 7
Регистрация: 09.01.2019
Сообщений: 141
20.05.2025, 10:17
Цитата Сообщение от VAF34 Посмотреть сообщение
Не нашел background.jpg
ЛКМ на вложении - ПКМ - сохранить как.
Надеюсь, объяснять, как потом эту картинку загрузить в sfml, не придётся?
0
397 / 33 / 7
Регистрация: 09.01.2019
Сообщений: 141
20.05.2025, 10:31
Результат должен быть примерно таким.
Это к тому пример, как рисовать без загрузки предварительно подготовленных изображений, текстурка там вообще просто для красивого фона
Миниатюры
Сохранение полученного на экране изображения на диск  
0
35 / 36 / 0
Регистрация: 10.06.2023
Сообщений: 578
20.05.2025, 10:38  [ТС]
Цитата Сообщение от EugeneNN Посмотреть сообщение
Посмотри этот пример
Вот что работает в моей VS2019 с SFML
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <SFML/Graphics.hpp>
 
int main()
{
    // Создаём окно
    sf::RenderWindow window(sf::VideoMode({ 600, 480 }), "SFML Works!");
    window.setVerticalSyncEnabled(true);
 
    // Создаём RenderTexture с проверкой
    sf::RenderTexture renderTexture({800, 600});
  /*  if (!renderTexture.create(800, 600)) {
        return -1; // ошибка создания
    } */
 
    // Круг для курсора
    sf::CircleShape cursorShape(10.f);
    cursorShape.setFillColor(sf::Color::Green);
 
    // Создание фигуры (круга)
    sf::CircleShape circle(30.f);
    circle.setFillColor(sf::Color::Green);
 
 
    // Правильное получение границ и установка центра
    sf::FloatRect circleBounds = circle.getLocalBounds();
 //   circle.setOrigin(circleBounds.width / 2.f, circleBounds.height / 2.f);
    circle.setPosition({ window.getSize().x / 2.f, window.getSize().y / 2.f });
 
     // Основной цикл
    while (window.isOpen())
    {
            while (const std::optional<sf::Event> event = window.pollEvent())
            { if (event->is<sf::Event::Closed>()) window.close();}
 
        // Обновляем позицию курсора
        sf::Vector2f mousePos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
        cursorShape.setPosition(mousePos);
        
        // Отрисовка
        window.clear(sf::Color::White);
 
        // Сначала рисуем на renderTexture
        renderTexture.clear(sf::Color::Transparent);
        renderTexture.draw(cursorShape);
        renderTexture.display();
 
        // Затем рисуем результат на окне
        sf::Sprite renderSprite(renderTexture.getTexture());
        window.draw(renderSprite);
 
        window.display();
    }
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2025, 10:38
Помогаю со студенческими работами здесь

Сохранение полученного графика в файл
Есть проблема , хочу сохранить график как картинку все для этого создал. Но мне когда я вожу код...

Отрисовка изображения поверх канвы (изображения) и вращение изображения
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder....

Масштабирование: увеличить изображение, полученное через Pixels[][], до размеров Image
Подскажите, пожалуйста, как увеличить изображение, полученное через Pixels, до размеров Image?...

Сохранение различных файлов в теле програмы (в создаваемой нами) и извлечение их(файлов) на локальный диск
Кароч тута такие дела: есть куча разных файликов которые пользователь проги недолжен видеть.При...

Сохранение на диск картинки
Пытаюсь сохранить картинку на диск, но вместо положенного размера 23965, в файл записывается 23979,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru