Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

использование BitBlt

85K
04 июля 2013 года
VictorR
7 / / 11.04.2013
Есть массив 256х256 байт, представляющий собой изображение, принимаемое от внешнего устройства. Массив обновляется каждую миллисекунду. Нужно успеть его прорисовать на канве формы. Можно ли связать этот массив с handle to source device context в функции BitBlt с тем чтобы быстро скопировать его на дескриптор окна формы?
Заранее благодарю за ответы
Виктор
414
05 июля 2013 года
CassandraDied
763 / / 24.05.2012
Цитата:
Массив обновляется каждую миллисекунду.


И

Цитата:
Нужно успеть его прорисовать на канве формы.


Я пока не знаю ответа на твой вопрос, мне просто интересно: а смысл стараться отображать на форме так быстро? Ни дисплей, ни тем более человеческий глаз не смогут так быстро отображать/воспринимать изображение.

327
06 июля 2013 года
UserNet2008
748 / / 03.04.2010
Если задумали об анимации на BitBlt то гоните эти мысли прочь.
Решение это:
Opengl or Directx
А как сделать связь с деревянной платформой Borland C++ Builder и Opengl or Directx это думаю Ыще то.
85K
06 июля 2013 года
fastergus2dog
3 / / 06.07.2013
Наверное найдите что нибуть попроще, или переходите в другую среду. Билдер не обладает такими особенностями чтобы на таких уровнях работать с графикой.
85K
08 июля 2013 года
VictorR
7 / / 11.04.2013
Спасибо за ответы, я, похоже, маленько погорячился, - не 1 мс, а около 20. Но тем не менее рисуется еще в несколько раз дольше! Данные, составляющие изображение принимаются по USB. Неужели никак нельзя узнать адрес BMP-массива, связанного с канвой с тем, чтобы сразу же его и заполнять принимаемыми байтами. Или адрес видеопамяти, куда отображается эта канва. Вероятно, я мыслю DOS-овскими категориями, которые под windows не работают. Если так - подскажите другой путь
414
08 июля 2013 года
CassandraDied
763 / / 24.05.2012
Даже 20мс — быстровато. Зачем? Для комфортного просмотра достаточно 24 кадра в секунду, то есть, если посчитать, получится одно обновление в 40мс.
Но это, конечно же, не решение проблемы.
Медленной отрисовка может быть по нескольким причинам:
  1. Во-первых, из-за того что что-то ещё выполняется в потоке GUI. Все операции, которые не связаны с интерфейсом, необходимо выносить в другие потоки.
  2. Во-вторых, из-за различных параметров изображения в массиве и изображения в bitmap. То есть, чтобы отобразить массив на bitmap необходимо преобразовать формат данных, а это занимает время.
Могу посоветовать выставить у bitmap такой же размер, какой у изображения в массиве. Я точно не знаю, как там всё работает, но, если следовать базовым знаниям по информатике, то цвет кодируется тремя байтами на пиксель. Массив 256х256, то есть картинка будет 85х85 пикселей. Стоит поставить именно такие размеры у bitmap, если я ничего не напутал. Не знаю, есть ли там альфа-канал, иначе надо добавить ещё один байт в расчёты. Если бы я знал структуру bitmap, то мог бы больше сказать о том, как преобразовывается исходный массив байт в изображение. Тебе надо избегать любых преобразований.
Если и эти советы не помогут ускориться, посмотри в сторону API функций. Если и использование API не даст скорости (во что я почти не верю), то единственный выход, как писал UserNet2008, использовать OpenGL или DirectX.
Но ты что-то определённо делаешь неправильно, потому что я сейчас прогнал несколько тестов BitBlt на своём железе с примерно в два раза большим размером изображения и у меня худший вариант был — 135FPS.
326
08 июля 2013 года
sadovoya
757 / / 19.11.2005
Можно перерисовывать только изменяющиеся пиксели, только не помню как это делается :)
7
12 июля 2013 года
@pixo $oft
3.4K / / 20.09.2006
Наверное, я особой ясности не внесу, но всё же. Насколько я помню, то ли сам дескриптор является указателем на место в памяти со структурой, в конце которой хранится собственно массив точек, то ли какой-то функцией можно получить адрес оной. Поэтому советую внимательно прочитать MSDN в части работы с графикой.
327
12 июля 2013 года
UserNet2008
748 / / 03.04.2010
Цитата:
Поэтому советую внимательно прочитать MSDN в части работы с графикой.


MSDN не при делах нужно читать про API функцию BitBlt в help Borland C++ Builder(??????????)

Цитата: sadovoya
Можно перерисовывать только изменяющиеся пиксели, только не помню как это делается :)


Вот здесь есть толика правды. Можно использовать маску. Если у автора темы ещё есть интерес , но не раньше next субботы.
P.s
Перемещения не большого объекта при помощи BitBlt

7
24 июля 2013 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: UserNet2008
MSDN не при делах нужно читать про API функцию BitBlt

А что, в MSDN уже перестали писать про API-функции? Собственно, такая функция там и описана.

91K
25 июля 2013 года
artem12345
1 / / 25.07.2013
Не
332
26 июля 2013 года
Valiant
416 / / 27.09.2004
Если кто то найдёт метод как перерисовывать только изменившиеся пиксели, то пожалуйста поделитесь.
У меня ни одной идеи как это можно реализовать.
327
31 июля 2013 года
UserNet2008
748 / / 03.04.2010
Цитата: Valiant
Если кто то найдёт метод как перерисовывать только изменившиеся пиксели, то пожалуйста поделитесь.
У меня ни одной идеи как это можно реализовать.


Код на VB6 для понятия концепции подойдёт Не могу найти на VC++ 6. т.к этим кодам ~15 годов. А VC++2008-2012 есть проблема с hDC. Я правда и очень и колупался.

332
31 июля 2013 года
Valiant
416 / / 27.09.2004
Цитата: UserNet2008
Цитата: Valiant
Если кто то найдёт метод как перерисовывать только изменившиеся пиксели, то пожалуйста поделитесь.
У меня ни одной идеи как это можно реализовать.


Код на VB6 для понятия концепции подойдёт Не могу найти на VC++ 6. т.к этим кодам ~15 годов. А VC++2008-2012 есть проблема с hDC. Я правда и очень и колупался.


В Васике нифига не понимаю. Ну мне хотя бы алгоритм.

327
31 июля 2013 года
UserNet2008
748 / / 03.04.2010
Код:
'Save background at new location
       lngRtn = BitBlt(picBack.hDC, 0, 0, lngW, lngH, _
            picClouds.hDC, lngX, lngY, vbSrcCopy)
        blnBackSaved = True
        'Apply mask
       lngRtn = BitBlt(picClouds.hDC, lngX, lngY, lngW, lngH, _
            picObjectMask.hDC, 0, 0, vbSrcAnd)
        'Draw object
       lngRtn = BitBlt(picClouds.hDC, lngX, lngY, lngW, lngH, _
            picObject.hDC, 0, 0, vbSrcPaint)
        picClouds.Refresh
Тут самое главное это vbSrcCopy, vbSrcAnd, vbSrcPaint
источник
Or screenshot

Вдогонку цвет черной звезды должен совпадать с фоном первой картинки (черный)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог