|
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 6
|
||||||
Замена цвета пикселей на черно-белый в выбранном окне11.12.2014, 22:16. Показов 5254. Ответов 8
Метки нет (Все метки)
Нужно расположить все открытые окна на экране (сделал). Затем выбрать одно из окон, определить его границы и в пределах этих границ сменить цвет на черно-белый. Как сменить цвет пикселей в загруженной картинке я разобрался, а вот со сменой цвета пикселей выбранного окна возникла проблема.
Если я правильно понял, то таким образом можно получить дискриптор окна: HDC hdc = GetDC(Form1->Handle), однако как внедрить это в имеющуюся программу я все равно не понимаю. Код имеющейся программы:
Окна.zip
0
|
||||||
| 11.12.2014, 22:16 | |
|
Ответы с готовыми решениями:
8
Черно-белый ковер. Черно белый график Из цветного pdf в черно-белый |
|
place status here
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
|
||||||||||||||||
| 12.12.2014, 04:59 | ||||||||||||||||
Сообщение было отмечено SatanaXIII как решение
Решение
После выполнения TileWindows регистрируешь (например) клавишу Escape (для "отлова" нажатий клавиш мыши вне формы нужно, насколько я понял, писать хук):
Для определения нажатия клавиши добавь на форму программы компонент ApplicationEvents. В его событии OnMessage (ApplicationEventsMessage) пропиши:
Если что-то в окне поменялось, то "завеса" спадает. В этом случае можешь (если будет результат) постоянно перекрашивать окно.
2
|
||||||||||||||||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
||||||
| 12.12.2014, 12:37 | ||||||
|
Ни на что не претендую, но вот тут кое чего чуть-чуть поломал:
Добавлено через 1 час 2 минуты 3 секунды Мысль еще - ускориться за счет считывания не попиксельно, а линиями: Bitmap->ScanLine. Но тут опасно. Формат пикселей надо учитывать.
2
|
||||||
|
place status here
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
|
|||||||
| 12.12.2014, 14:21 | |||||||
|
Вчера я затупил, и "выдать" строчки 57-58 вместо SetPixel мозг уже не смог.
Про ScanLine я также упомянул, но хз как с ним работать. Насчет опасности - осторожно, наверно, можно. Опыта нет, пример в билдере бегло просмотрел.
Добавлено через 21 минуту P.S.: и дело даже не в том, что SetPixel в цикле. Сам SetPixel "тормозной" до невозможности. А BitBlt работает реально быстрее.
1
|
|||||||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|||||||||||||||||||
| 12.12.2014, 14:42 | |||||||||||||||||||
|
Вот тут ребята кстати как-то тем же самым баловались: Как попиксельно сравнить 2 изображения
А вот с записью сложнее. Можно конечно тем же макаром попробовать, только в обратную сторону: получить указатель на линию и писать порциями по TRGBTriple байт. Но как-то все это вилами по воде. Зато скорость будет закачаешься. VCL просто работает с GDI, и предоставляет хоть и надежные методы, и кучу их всяческих, но все же чудеса с ней трудно вытворять. Вот тут Авазарт как-то баловался с GDI+, которая уже вполне вероятно такое потянет. Мораль: надо короче либо на уровень ниже переходить, либо выше. Добавлено через 2 минуты Добавлено через 25 секунд Все сошлось. ![]() Добавлено через 10 минут Информация в тему. Именно быстрый доступ к пикселям в GDI и в MFC
При написании фильтров для изображения требуется способ доступа к отдельным пикселям. Самый простой способ - сделать это с помощью функций GetPixel/SetPixel в WinAPI и MFC и с помощью двумерного массива TCanvas->Pixels в VCL. Однако так поступать не стоит, поскольку такой способ является чрезвычайно медленным.
Быстрый способ доступа к пикселям в GDI и MFC: При работе с функциями GDI напрямую, наиболее удобным представляется создание объекта bitmap, к пикселям которого можно обращаться напрямую. Делается это с помощью функции CreateDIBSection. Одним из выходных параметров этой функции является указатель на переменную, куда при создании bitmap будет помещен указатель на массив пикселей - ppvBits. Запомнив этот указатель, приложение получает прямой доступ к пикселям изображения. Обычно использующиеся true color изображения с глубиной цвета 24 bit хранят данные попиксельно в виде массива троек `BGR' (каждый пиксель - три байта). Адрес пикселя с координатами (x, y) для изображений такого типа рассчитывается следующим образом:
Здесь iBytesPerLine - это длина строки изображения в байтах, которая отнюдь не всегда равна ширине изображения, умноженной на три. Для увеличения производительности работы с изображением адреса начал строк выравниваются по границе процессорного слова (4 байта), поэтому если ширина, умноженная на 3, не кратна четырем, каждая из строк дополняется несколькими дополнительными байтами . Рассчитать длину строки в байтах можно по следующей формуле:
Именно таким образом быстрый доступ к пикселям изображения реализован в классе DSimpleBitmap в примере MFC_GML3. Быстрый способ доступа к пикселям в VCL: Для того чтобы получить прямой доступ к указателю на пикселы изображения, хранящегося в TBitmap, нужно использовать свойство ScanLine. Это массив указателей на строки пикселей изображения. Доступ к пикселю с координатами (x, y) осуществляется следующим образом:
Буду очень сильно благодарен, если кто удосужится провести серию опытов с обоими предложенными методами, и соответственно поделится кодом (чтобы каждый мог у себя проверить) и сравнительными результатами.
1
|
|||||||||||||||||||
| 12.12.2014, 15:27 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 6
|
||
| 12.12.2014, 16:52 [ТС] | ||
0
|
||
| 13.12.2014, 06:00 | |
|
Может проще сделать снимок окна, перевести его в Ч/Б и наложить его сверху. Либо создать Layered окно, и наложить его (может быть сделать дочерним) сверху.
0
|
|
|
place status here
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
|
|
| 13.12.2014, 11:49 | |
|
0
|
|
| 13.12.2014, 11:49 | |
|
Помогаю со студенческими работами здесь
9
Черно-белый сайт по кнопке! Цветной BMP в черно-белый Японский кроссворд(черно-белый) Чёрно-белый скрин экрана Преобразовать рисунок в черно-белый по алгоритму Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|