Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751

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

16.05.2025, 12:14. Показов 5055. Ответов 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
Заблокирован
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
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751
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
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751
18.05.2025, 13:05  [ТС]
Цитата Сообщение от EugeneNN Посмотреть сообщение
Вам бы для начала научиться яснее выражать мысли
Если вам было что-то непонятно, то задали бы вопрос, как многие и делают. Из вашего текста, отвечая на ваши замечания, решения я не вижу. Если вашего опыта достаточно, изобразите программку, рисующую линию задаваемой толщины и сохраняющую это в png. У меня с помощью DeepSeek и GPT-mini это не получается.
0
Заблокирован
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
Заблокирован
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
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751
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
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751
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
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751
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
52 / 53 / 2
Регистрация: 10.06.2023
Сообщений: 751
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru