bmp:HBITMAP;
bm:BITMAP;
GetObject(bmp, sizeof(bm), @bm);
Как загрузить bitmap в обычный массив
Что делать? Неужели нет способа сделать это с помощью WinAPI? Придется ботать формат файла и грузить руками?
Я не могу даже просто получить размер картинки в пикселях без указания HDC!
Код:
Итак, ботаем формат 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).
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.
странно,
Цитата:
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.
Код:
bmp:=LoadImage(0,PChar('1.bmp'),IMAGE_BITMAP,0,0,LR_LOADFROMFILE or LR_CREATEDIBSECTION);
GetObject(bmp,sizeof(bm),@bm);
DeleteObject(bmp);
GetObject(bmp,sizeof(bm),@bm);
DeleteObject(bmp);
после такой загрузки изображения bmBits не nil