С Новым годом! Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187

Рисование PNG картинок

06.11.2021, 14:04. Показов 2593. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите пожалуйста как мне реализовать функцию генерации (png) картинки состоящей из..
1. Размер изображения берется из getSize() картинки фона. Это PNG с альфа-каналом обязательно должен быть как задний фон.
2. На фон нужно наложить прямоугольники определенного размера и обводка нужного цвета и толщины.
3. На фон наложить линию, нужной толщины и по координатам a и b.

В идеале это массив данных с возможностью сохранения каждой итерации. Для того чтобы мне потом сделать анимированный gif. Если анимированный gif можно сделать через sfml я буду просто счастлива.

Система Linux/g++ 9.3.0/sfml 2.5.1

Я знаю как это сделать через RenderWindow, но визуализация мне не нужна, а как сделать сразу в .png/gif картинку понять не могу.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2021, 14:04
Ответы с готовыми решениями:

Рисование PNG на Timage
Сразу: проблема рисования на канве TImage.Bitmap, первый раз загружается некая картинка: image1.Bitmap:=image; Далее картинка с...

Рисование png с прозрачностью
Собственно, нужно нарисовать два png поверх друг друга, причем используя для одного из них некоторое смещение. В чем это проще всего...

Спрайты из PNG картинок
Здравствуйте. Меня интересует как работать со спрайтами не bmp а PNG На Image должен ложится TPNGObject как отдельный объект чтобы к...

4
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,328
Записей в блоге: 2
06.11.2021, 14:31
Helen_2001, Сохранить GIF из плюсов находится такая простая библиотека, судя по примеру width * height * 4 как раз для каждого кадра используется RGBA8 картинка.
В sfml есть класс sf::RenderTexture который позволяет рендерить в текстуру. Так как SFML построен на OpenGL, то можно вытащить пиксели из этой текстуры и они будут в формате нужном для первой либы.
Осталось это соединить. Алгоритм примерно такой, создаем картинку, сохраняем как кадр гифки, рисуем элемент, сохраняем как следующий кадр и так пока не закончим рисовать.
Единственное в чем вижу сложность, так это получение байт из текстуры, из текстуры можно получить image, а он имеет только возможность записи в файл

Добавлено через 6 минут
На крайний случай можно вытащить через sf::RenderTexture::getTexture() -> sf::Texture::getNativeHandle() -> glGetTexImage, надеюсь sfml использует хотя бы 2 версию opengl (судя по дока там аж 2.1, что уже хорошо)
1
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
06.11.2021, 14:39  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
В sfml есть класс sf::RenderTexture который позволяет рендерить в текстуру.
Мне бы пример как на sf::Image.loadFromFile наложить десяток sf::RectangleShape и сохранить в файл. Без всякого всплывающего в цикле gui

Добавлено через 1 минуту
Цитата Сообщение от alecss131 Посмотреть сообщение
GIF из плюсов находится такая простая библиотека
....input format. (The alpha is ignored.)
0
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,328
Записей в блоге: 2
06.11.2021, 15:39
Лучший ответ Сообщение было отмечено Helen_2001 как решение

Решение

Helen_2001, Вот пример создания гифки, то как я описал, пусть и без прозрачности
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
#include <SFML/Graphics.hpp>
#include "gif.h"
#include <string>
 
void writeFrame(GifWriter &gw, sf::RenderTexture &rt, int delay);
 
int main() {
    int width{800};
    int height{600};
    int delay{60};
    std::string name{"out.gif"};
    sf::RenderTexture rt{};
    GifWriter gw{};
    //рисиуем в гифку фон белого цвета
    rt.create(width, height);
    rt.clear(sf::Color::White);
    GifBegin(&gw, name.c_str(), width, height, delay);
    writeFrame(gw, rt, delay);
    //рисуем круг
    sf::CircleShape shape{50.0f};
    shape.setFillColor(sf::Color{150, 50, 250});
    shape.setPosition(50.0f, 50.0f);
    rt.draw(shape);
    writeFrame(gw, rt, delay);
    //рисуем обводку кругу
    shape.setOutlineThickness(10.0f);
    shape.setOutlineColor(sf::Color{250, 150, 100});
    rt.draw(shape);
    writeFrame(gw, rt, delay);
    //сохраняем гиф файл
    GifEnd(&gw);
    return 0;
}
 
void writeFrame(GifWriter &gw, sf::RenderTexture &rt, int delay) {
    rt.display();
    sf::Image im{rt.getTexture().copyToImage()};
    GifWriteFrame(&gw, im.getPixelsPtr(), im.getSize().x, im.getSize().y, delay);
}
Результат
1
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,328
Записей в блоге: 2
06.11.2021, 21:26
Лучший ответ Сообщение было отмечено Helen_2001 как решение

Решение

Если что то вот код который сохраняет кадры в отдельные png файлы с прозрачностью, но gif придется делать вручную.
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
#include <SFML/Graphics.hpp>
#include <string>
 
void writeFrame(sf::RenderTexture &rt);
 
int main() {
    int width{800};
    int height{600};
    sf::RenderTexture rt{};
    //рисиуем фон белого цвета
    rt.create(width, height);
    rt.clear(sf::Color::White);
    writeFrame(rt);
    //рисуем круг
    sf::CircleShape shape{50.0f};
    shape.setFillColor(sf::Color{150, 50, 250});
    shape.setPosition(50.0f, 50.0f);
    rt.draw(shape);
    writeFrame(rt);
    //рисуем обводку кругу
    shape.setOutlineThickness(10.0f);
    shape.setOutlineColor(sf::Color{250, 150, 100});
    shape.setFillColor(sf::Color::Transparent);
    rt.draw(shape);
    writeFrame(rt);
    return 0;
}
 
void writeFrame(sf::RenderTexture &rt) {
    rt.display();
    sf::Image im{rt.getTexture().copyToImage()};
    static int num{};
    im.saveToFile(std::to_string(num) + ".png");
    rt.clear(sf::Color::Transparent);
    num++;
}
Результат
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2021, 21:26
Помогаю со студенческими работами здесь

Рисование пикселя в png с прозраснотью от 0 до 1
Столкнулся с проблемой, дана некая картинка, нужно в ней изменить прозрачность пикселя, не сделать его прозрачным путем залития цветом...

Много маленьких PNG картинок
Добрый день, с Праздниками! Подскажите стек технологий, плиииииз. Я новичок в серверных технологиях и в серверной Ноде, а здесь...

Несколько png картинок в 1 image
Собственно я тут задался вопросом. В Lasarus я обнаружил поддержку PNG НО САМ МОДУЛЬ PNGImage я ненашел. Собственно я хотел спросить...

Хранение png картинок в бд MySql
Добрый день уважаемые форумчане. Вот дошел до момента где нужно хранить картинки в базе данных. Но не имею не какого представление как это...

Рисование нa канве TImage с загруженным png
Здравствуйте. Загружаю в image png. После этого при попытке что либо нарисовать на канве выдает сообщение &quot;Can only modify an image if...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru