Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнить битмапы 
V
    Опции темы
Agentx86
Дата 8.4.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Доброй ночи. Мне нужно сравнить вручную все пиксели на двух битмапах. Есть функция GetPixel. Но там надо иметь контекст устройства. У меня имеется  BITMAPINFO и  BITMAPFILEHEADER. Не обязательно использовать функцию GetPixel.  Мне главное получить цвет каждого пикселя  имея BITMAPINFO и BITMAPFILEHEADER.

За ранее большое спасибо.
PM MAIL   Вверх
Alexeis
Дата 8.4.2010, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Agentx86, посмотрите примеры по функции GetDIBits .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Agentx86
Дата 8.4.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 тоже нужен контекст. Мне кажется, что я чтото просто не понимаю. И хожу вокруг.
PM MAIL   Вверх
Alexeis
Дата 8.4.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(Agentx86 @  8.4.2010,  22:00 Найти цитируемый пост)
 Да есть примеры, но чтото везде требуется контекст устройства. Объясните незнающему. В GetDIBits тоже нужен контекст. Мне кажется, что я чтото просто не понимаю. И хожу вокруг. 

  Нужен контекст битмапа, для объекта в памяти. Но он тут играет не основную роль, а вспомогательную. GetDIBits даст прямой доступ к памяти битмапа. Дальше уже контекст не нужен.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Agentx86
Дата 8.4.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Alexeis, вы хотите сказать, что у меня вот такое должно работать    GetDIBits(hdc,hBitmap,0,Bitmap1->bmiHeader.biHeight,(void*)data,Bitmap1,DIB_RGB_COLORS);?
Здесь только Bitmap1 хранить информацию о изображении. Все остальные переменные пустые.
PM MAIL   Вверх
GremlinProg
Дата 9.4.2010, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alexeis
Дата 9.4.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Agentx86, примеров работы с GetDIBits немало на форуме. Вот, например, загрузка с созданием DIB http://forum.vingrad.ru/forum/topic-121143...bits/index.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Agentx86
Дата 9.4.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Немогу сейчас привести пример кода. Расскажу по памяти. У меня программа работает с вебкамерой. Она снимает к примеру какойто снимок. Потом создается файл. В него записывает BITMAPFILEHEADER и BITMAPINFO. Мне надо, чтобы не записывая эти данные в файл я их както мог проанализировать. Alexeis, я посмотрел темку. Но там все сводится к тому что мы грузим битмап из файла и потом выбираем его в контекст устройства. Тогда мой вопрос сводится к тому как имея BITMAPFILEHEADER и BITMAPINFO создать hBitmap?


Это сообщение отредактировал(а) Agentx86 - 9.4.2010, 15:04
PM MAIL   Вверх
Alexeis
Дата 9.4.2010, 15:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(Agentx86 @  9.4.2010,  14:01 Найти цитируемый пост)
Тогда мой вопрос сводится к тому как имея BITMAPFILEHEADER и BITMAPINFO создать hBitmap?

  Так строчка
Код

dib = CreateDIBSection(bDC, &DIBInfo, DIB_RGB_COLORS, (VOID**)&pBits, 0, 0);

И создает битмап, точнее его разновидность DIB секцию. Диб секция также имеет HBitmap, но при этом дает прямой доступ к памяти.

К сожалению винда не умеет создавать диб секцию прям для bmp файла, поэтому и пришлось конвертировать одно в другое. Если нужна DIB секция, то нужно сразу же и создавать ее.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Agentx86
Дата 10.4.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Решил проблему. Кому надо будет сделать тоже самое достаточно написать вот такую строчку
CreateDIBSection(NULL, Bitmap1, DIB_RGB_COLORS, &pvbits, 0, 0x0);
Самое главное Bitmap1 должна быть правильно заполнена. У меня там кое что небыло заполнено поэтому и был полный бред. Вот мой пример заполнения.
Код

Bitmap1->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
Bitmap1->bmiHeader.biHeight = 480;
Bitmap1->bmiHeader.biWidth =  640;
Bitmap1->bmiHeader.biPlanes = 1;
Bitmap1->bmiHeader.biBitCount = 24;
Bitmap1->bmiHeader.biCompression = BI_RGB;
Bitmap1->bmiHeader.biSizeImage = Bitmap1->bmiHeader.biHeight * Bitmap1->bmiHeader.biWidth * 4;

Также советую почитать темку на которую давал ссылку Alexeis.

Alexeis, спасибо за терпение и помощь.

Добавлено через 1 минуту и 16 секунд
p.s. Alexeis, репутацию не могу повысить так как не хватает одного поста до 100. Когда будет 100 то повышу smile 
PM MAIL   Вверх
Agentx86
Дата 11.4.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Тема продолжается. Битмапы я то получил. Но как их сравнить?
Я сначала загрузил их в контекст устройства. Вызывал GetPixel. Да я могу получить цвет пикселя. Но мне надо получить цвет пикселя когда окно скрыто. Значит вызывать GetPixel для контекста устройства глупо. Вопрос. Как сравнить попиксельно два HBITMAPA?
PM MAIL   Вверх
Alexeis
Дата 11.4.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Agentx86, зачем же GetPixel в приведенном примере 
Код

dib = CreateDIBSection(bDC, &DIBInfo, DIB_RGB_COLORS, (VOID**)&pBits, 0, 0);

pBits это уже указатель на матрицу пикселей. Каждый из них это цвет в формате RGB. Цвета идут в порядке BGR.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GremlinProg
Дата 13.4.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Agentx86 @  11.4.2010,  02:06 Найти цитируемый пост)
Как сравнить попиксельно два HBITMAPA?

ну тебе же с первых сообщений твердят: приведи форматы битмапов к одному виду, например к 32-битному,
а сравнить их можно элементарно, хотя бы с помощью простого memcmp

приводи так же: с помощью GetDIBits

p.s.: можно и к 24-битному, но есть шанс сравнить мусор в заполнителе(padding) на концах строк,
вобщем - надежнее 32 бита, он не требует выравнивания


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.2155 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.