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

Ваш аккаунт

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

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

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

Как загрузить bitmap в обычный массив

350
25 сентября 2007 года
cheburator
589 / / 01.06.2006
В WinAPI есть функции для загрузки битмапа, получения его битов... Но: GetDIBits просит контекст устройства. Я же хочу просто загрузить bitmap "как есть", вне зависимости от какого-либо устройства (картинка все равно будет передаваться по сети на другую машину), а эта функция, как я понял, преобразует bitmap в формат данного устройства.
Что делать? Неужели нет способа сделать это с помощью WinAPI? Придется ботать формат файла и грузить руками?
Я не могу даже просто получить размер картинки в пикселях без указания HDC!
268
25 сентября 2007 года
Михаил
587 / / 25.06.2005
используй GetObject

 
Код:
bmp:HBITMAP;
bm:BITMAP;

GetObject(bmp, sizeof(bm), @bm);
350
27 сентября 2007 года
cheburator
589 / / 01.06.2006
Легко. Использовал уже. Получил ВСЁ, кроме самих пикселей...
Итак, ботаем формат BMP:
Файл BMP тупо содержит 4 последовательные вещи (как правило, понадобятся только 3):
1. BITMAPFILEHEADER
2. BITMAPINFOHEADER
3. Массив RGBQUAD. Что-то вроде палитры. В 15-16-24-32-битных битмапах не обращаем на него внимания.
4. Массив битов (собственно, значения пикселей).
Структуры BITMAPFILEHEADER, BITMAPINFOHEADER см. в MSDN.
Вместо BITMAPINFOHEADER может использоваться структура BITMAPV4HEADER или BITMAPV5HEADER, но те включают в себя BITMAPINFOHEADER, и какая именно структура используется - можно легко определить по первому члену структуры (который у всех одинаков) - biSize или bv4Size или bv5Size - содержащему размер структуры.
Алгоритм чтения таков.
1. Читаем BITMAPFILEHEADER.
2. Читаем BITMAPINFOHEADER.
3. Если нам нужны члены структур BITMAPV4HEADER или BITMAPV5HEADER, смотрим, действительно ли файл содержит одну из этих структур, и если содержит, читаем и анализируем.
4. В структуре BITMAPFILEHEADER содержалось смещение до значений пикселей. Доходим до этого места, и дальше читаем значения пикселей.
При необходимости в этот алгоритм вставляется проверка на глубину цвета (биты на пиксел), размер картинки, сжатие картинки. Эта инфа содержится в BITMAPINFOHEADER и производных от нее структурах (BITMAPV4HEADER, BITMAPV5HEADER).
268
27 сентября 2007 года
Михаил
587 / / 25.06.2005
странно, http://msdn2.microsoft.com/en-us/library/ms532298.aspx ясно говорит, что bmBits
Цитата:

Pointer to the location of the bit values for the bitmap. The bmBits member must be a long pointer to an array of character (1-byte) values.

268
27 сентября 2007 года
Михаил
587 / / 25.06.2005
я так понимаю bmBits был равен nil?
 
Код:
bmp:=LoadImage(0,PChar('1.bmp'),IMAGE_BITMAP,0,0,LR_LOADFROMFILE or LR_CREATEDIBSECTION);
  GetObject(bmp,sizeof(bm),@bm);
  DeleteObject(bmp);

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