Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

BMP как типизированный файл   Найти похожие ветки 

 
Bardt   (2006-04-13 20:00) [0]

Мне требуется считать информацию из BMP файла, при этом рассматривать этот файл как типизированный. Т.е. мне нужно знать внутреннее представление данных в этом формате и с помощью записей и переменных каких типов можно сосчитать информацию о RGB составляющих цвета конкретного пикселя. Примеры в Cи нашел. Нужно для Delphi. Помогите чем сможете.


 
Eraser ©   (2006-04-13 22:53) [1]


> Bardt   (13.04.06 20:00)

TBitmap.ScanLine


 
Rial ©   (2006-04-14 00:21) [2]

Там лежат (в той же последовательности)
1.  FileHeader: TBITMAPFILEHEADER;
2.  InfoHeader: TBITMAPINFOHEADER;
3.  Palette размером InfoHeader.biClrUsed
4.  Сами данные  InfoHeader.biWidth*InfoHeader.biHeight*(InfoHeader.biBitCount shr 3), в зависимости от PixelFormat, 0.25,1,2,3 или 4 байта на пиксель.


 
Bardt   (2006-04-14 13:28) [3]

Спасибо. А пример исходника все это считывающего не найдется?


 
Jeer ©   (2006-04-14 14:11) [4]

Привести линки на поисковые системы ?


 
Rial ©   (2006-04-14 18:25) [5]


procedure LoadBitmap(Filename: String; out Width: Cardinal; out Height: Cardinal; out pData: Pointer);
var
 FileHeader: TBITMAPFILEHEADER;
 InfoHeader: TBITMAPINFOHEADER;
 Palette: array of RGBQUAD;
 BitmapFile: THandle;
 BitmapLength: LongWord;
 PaletteLength: LongWord;
 ReadBytes: LongWord;
begin
 BitmapFile := CreateFile(PChar(Filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 if (BitmapFile = INVALID_HANDLE_VALUE) then begin
   MessageBox(0, PChar("Error opening "" + Filename), PChar("BMP Unit"), MB_OK);
   Exit;
 end;

 ReadFile(BitmapFile, FileHeader, SizeOf(FileHeader), ReadBytes, nil);
 ReadFile(BitmapFile, InfoHeader, SizeOf(InfoHeader), ReadBytes, nil);

PaletteLength := InfoHeader.biClrUsed;
 SetLength(Palette, PaletteLength);
 ReadFile(BitmapFile, Palette, PaletteLength, ReadBytes, nil);
 if (ReadBytes <> PaletteLength) then begin
   MessageBox(0, PChar("Error reading palette"), PChar("BMP Unit"), MB_OK);
   Exit;
 end;

 Width := InfoHeader.biWidth;
 Height := InfoHeader.biHeight;
 BitmapLength := InfoHeader.biSizeImage;
 if BitmapLength = 0 then
   BitmapLength := Width * Height * InfoHeader.biBitCount Div 8;

 GetMem(pData, BitmapLength);
 ReadFile(BitmapFile, pData^, BitmapLength, ReadBytes, nil);
 if (ReadBytes <> BitmapLength) then begin
   MessageBox(0, PChar("Error reading bitmap data"), PChar("BMP Unit"), MB_OK);
   Exit;
 end;
 CloseHandle(BitmapFile);
end;


 
SamBrook ©   (2006-04-14 20:05) [6]

В приведенном выше коде две неточности, которые могут стать причиной глюков

BitmapLength := Width * Height * InfoHeader.biBitCount Div 8;

Не учитывается выравнивание строки на 4 байта. При biBitCount=1 или 4 тоже  может неправильно определяться размер
Правильный размер строки:

 BitmapWidth:=(Width * InfoHeader.biBitCount +31) shr 5 shl 2;



GetMem(pData, BitmapLength);

При попытке отобразить изображение на экране с  помощью функции StretchDiBits будут проблемы с большими bitmap-ами на Win2k/XP.
Лучше заменить на

pData:=GlobalAllocPtr(BitmapLength, GPTR);

и соответственно освобождение:

GlobalFreePtr(pData);



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.054 c
8-1144944008
Bardt
2006-04-13 20:00
2006.11.26
BMP как типизированный файл


15-1162586445
ProgRAMmer Dimonych
2006-11-03 23:40
2006.11.26
Наверное, уже неоднократно этот вопрос задавали, но...


3-1159078435
Urvin
2006-09-24 10:13
2006.11.26
Нет записи в бд с Firebird


1-1161081043
AN\ndrey
2006-10-17 14:30
2006.11.26
Как открыть Шаблон документа с расширением *.DOT ?


15-1162916261
*Стажер*
2006-11-07 19:17
2006.11.26
Компьютер программиста, какой он?