![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Agentx86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Доброй ночи. Мне нужно сравнить вручную все пиксели на двух битмапах. Есть функция GetPixel. Но там надо иметь контекст устройства. У меня имеется BITMAPINFO и BITMAPFILEHEADER. Не обязательно использовать функцию GetPixel. Мне главное получить цвет каждого пикселя имея BITMAPINFO и BITMAPFILEHEADER.
За ранее большое спасибо. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Agentx86, посмотрите примеры по функции GetDIBits .
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Agentx86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Чтото я вообще не понимаю. К примеру я нашел вот такой код
HBITMAP hBitmap; // Дескриптор устройства растра HDC hdc = NULL; // Создание совместимого контекста устройства unsigned char* data = 0; // Указатель на наше измененное в размерах изображение hBitmap = CreateDIBSection (hdc, (BITMAPINFO*)(&bfh2), DIB_RGB_COLORS, (void**)(&data), NULL, NULL); В bfh2 передаю свой bitmapinfo. В результат возвращает ноль. Да есть примеры, но чтото везде требуется контекст устройства. Объясните незнающему. В GetDIBits тоже нужен контекст. Мне кажется, что я чтото просто не понимаю. И хожу вокруг. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Нужен контекст битмапа, для объекта в памяти. Но он тут играет не основную роль, а вспомогательную. GetDIBits даст прямой доступ к памяти битмапа. Дальше уже контекст не нужен. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Agentx86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Alexeis, вы хотите сказать, что у меня вот такое должно работать GetDIBits(hdc,hBitmap,0,Bitmap1->bmiHeader.biHeight,(void*)data,Bitmap1,DIB_RGB_COLORS);?
Здесь только Bitmap1 хранить информацию о изображении. Все остальные переменные пустые. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну если нет ничего кроме данных о картинке из файла, то почему бы эту картинку и не грузить из файла (LoadImage)?
а если это не файл, а например BLOB из БД, то для создания битмапа помимо заголовков требуются сами данные о картинке, которые обычно располагаются за заголовками, так что значение data и значение с типом BITMAPINFOHEADER по крайней мере обязаны быть, это исходные данные 1. а после этого можно уже и к функциям обращаться: - CreateDIBSection - создать device-independent bitmap - CreateBitmap - создать device-dependent bitmap разница конечно есть, так что тут надо использовать по крайней мере то, что соответствует исходным данным (визуально эту разницу можно увидеть: будет сдвиг картинки - следствие использования разного строчного выравнивания) после того как битмап будет создан, можно его выбрать в HDC и получить от него что захочешь 2. если захочешь чтобы можно было работать немного быстрее, то Alexeis, предложил очень правильный способ: привести битмап сначала к тому формату, в котором работает твоя программа (например 32-битный), а уже затем, обратиться напрямую к нему в памяти за получением цветовых компонент 3. ну а если уж совсем быстро, то придется приложить дополнительные усилия: писать код для каждого формата, например для всех неупакованных, их около шести + зависимость device-dependent-independent - итого - 12, т.е. это муторно и редко оправдано так что варианты 2 и 3 можно оставить напотом, если захочешь, а первый, на результат - само то, хотя повторюсь, еще более простой - LoadImage -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Agentx86, примеров работы с GetDIBits немало на форуме. Вот, например, загрузка с созданием DIB http://forum.vingrad.ru/forum/topic-121143...bits/index.html
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Agentx86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Немогу сейчас привести пример кода. Расскажу по памяти. У меня программа работает с вебкамерой. Она снимает к примеру какойто снимок. Потом создается файл. В него записывает BITMAPFILEHEADER и BITMAPINFO. Мне надо, чтобы не записывая эти данные в файл я их както мог проанализировать. Alexeis, я посмотрел темку. Но там все сводится к тому что мы грузим битмап из файла и потом выбираем его в контекст устройства. Тогда мой вопрос сводится к тому как имея BITMAPFILEHEADER и BITMAPINFO создать hBitmap?
Это сообщение отредактировал(а) Agentx86 - 9.4.2010, 15:04 |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Так строчка
И создает битмап, точнее его разновидность DIB секцию. Диб секция также имеет HBitmap, но при этом дает прямой доступ к памяти. К сожалению винда не умеет создавать диб секцию прям для bmp файла, поэтому и пришлось конвертировать одно в другое. Если нужна DIB секция, то нужно сразу же и создавать ее. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| Agentx86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Решил проблему. Кому надо будет сделать тоже самое достаточно написать вот такую строчку
CreateDIBSection(NULL, Bitmap1, DIB_RGB_COLORS, &pvbits, 0, 0x0); Самое главное Bitmap1 должна быть правильно заполнена. У меня там кое что небыло заполнено поэтому и был полный бред. Вот мой пример заполнения.
Также советую почитать темку на которую давал ссылку Alexeis. Alexeis, спасибо за терпение и помощь. Добавлено через 1 минуту и 16 секунд p.s. Alexeis, репутацию не могу повысить так как не хватает одного поста до 100. Когда будет 100 то повышу |
|||
|
||||
| Agentx86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Тема продолжается. Битмапы я то получил. Но как их сравнить?
Я сначала загрузил их в контекст устройства. Вызывал GetPixel. Да я могу получить цвет пикселя. Но мне надо получить цвет пикселя когда окно скрыто. Значит вызывать GetPixel для контекста устройства глупо. Вопрос. Как сравнить попиксельно два HBITMAPA? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Agentx86, зачем же GetPixel в приведенном примере
pBits это уже указатель на матрицу пикселей. Каждый из них это цвет в формате RGB. Цвета идут в порядке BGR. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну тебе же с первых сообщений твердят: приведи форматы битмапов к одному виду, например к 32-битному, а сравнить их можно элементарно, хотя бы с помощью простого memcmp приводи так же: с помощью GetDIBits p.s.: можно и к 24-битному, но есть шанс сравнить мусор в заполнителе(padding) на концах строк, вобщем - надежнее 32 бита, он не требует выравнивания -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |