Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос насчет битмапа в Direct2D  (Прочитано 226 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jur
Помогающий

lt
Offline Offline

« : 03-07-2026 07:06 » 

Привет!

Недавно начал работать с Direct2D. У меня есть ряд окон сигналов, которые рисуются с помощью этой библиотеки. В окне отображаются оси X и Y, а в основном поле окна рисуется сигнал. При этом оси не меняются, а меняется сам сигнал. Напрашивается разделение рисования статических элементов (оси) и самого сигнала. Для этого статика рисуется в битмап и выводится при обновлении окна. Затем к ней добавляется рисование сигнала. Это замечательно работает. Но мне понадобилось, в отладочных целях, сохранить битмап в файл (например PNG). Казалось бы что проще. Но не тут-то было. Неделю бодаюсь с этой проблемой - никак. Приснопамятный ИИ уже задрал. Он предлагает множество вариантов, но ни один не работает. Мне бы просто выцарапать из битмапа картинку в стиле GDI/GDI+, а дальше я без проблем ее сохраню.

Подскажите, пожалуйста, как это сделать?

P.S. Не нашел раздела подходящего под Direct2D. Переместите, пожалуйста, в правильный раздел.
Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 04-07-2026 05:03 » 

jur, а что мешает рисовать всё на одном полотне ? На быстродействии это вряд ли скажется, а удобство повысится Улыбаюсь

По библиотеке не подскажу, затрагивал её мало, да и не помню ничего. Но формат BMP известен, его легко вручную собрать, тем более, что для отладки (скорость не требуется)

Вот, со студентами не так давно диаграмму Вороного наивным способом рисовали
https://www.onlinegdb.com/kEdUaVEAD#

только структуры BITMAPFILEHEADER, BITMAPINFOHEADER и вообще всё из файла "bitmap_headers.h" не нужно тащить, это в винде всё сразу есть



Добавлено через 2 минуты и 14 секунд:
можно ещё обратить внимание на функцию GetDIBits https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getdibits

« Последнее редактирование: Вчера в 04:46 от Алексей++ » Записан

jur
Помогающий

lt
Offline Offline

« Ответ #2 : 07-07-2026 10:11 » 

Я забыл уточнить. Сейчас я все рисую с помощью GDI+, а это делается с помощью CPU (а в некотором режиме работы программы окон сигнала до 6 шт.). Моя идея в том, чтобы задействовать аппаратное ускорение графики. Это позволяет сделать Direct2D. Т.е. я рисую статику, как и сейчас, с помощью GDI+, сохраняю нарисованное в битмап и затем быстро, с помощью Direct2D, вывожу её в окно. А потом только дорисовываю сигнал средствами Direct2D. Я с этой библиотекой раньше не работал и не знаю, как в ней добраться до пикселей в ID2D1Bitmap. Точнее, я до этого вопроса пока не добрался Улыбаюсь

Кстати, я тут подумал, а может вывод в окно битмапа с сохраненной статикой средствами GDI+ тоже достаточно быстрый? Ведь это не рисование всех осей с нуля (с текстами, рисками и т.п.), а просто вывод готовой картинки? Надо бы попробовать...
Записан

MPEG-4 - в массы!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : Вчера в 20:34 » new

Как простой вариант... Не знаю куда тут Direct2D засунуть, но если нужно сохранить "рисунок", то (псевдокод)

1 создаём ВМР с нужными параметрами, как основу DC

   pBitmap = new Bitmap(Width, Height, PixelFormat24bppRGB);
   pBitmap->SetResolution(...);

   pGraphics = Graphics::FromImage(pBitmap);
   pGraphics->Clear(Color::White); // любой другой цвет фона
   pGraphics->SetInterpolationMode(InterpolationModeHighQuality); при необходимости и в зависимости от разрешения

2 в pGraphics рисуем всё что надо,

3 сохраняем в файл
CLSID clsID;
GetCLSID(L"image/png", &clsID);
pBitmap->Save(FileName, &clsID);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines