![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BMP как типизированный файл [D7, WinXP]
Bardt © (2006-04-13 20:00:00)Мне требуется считать информацию из BMP файла, при этом рассматривать этот файл как типизированный. Т.е. мне нужно знать внутреннее представление данных в этом формате и с помощью записей и переменных каких типов можно сосчитать информацию о RGB составляющих цвета конкретного пикселя. Примеры в Cи нашел. Нужно для Delphi. Помогите чем сможете.
SamBrook (2006-04-14 20:05:00) [1]В приведенном выше коде две неточности, которые могут стать причиной глюков
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);
Rial (2006-04-14 18:25:00) [2]
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;
Jeer (2006-04-14 14:11:00) [3]Привести линки на поисковые системы ?
Bardt (2006-04-14 13:28:00) [4]Спасибо. А пример исходника все это считывающего не найдется?
Rial (2006-04-14 00:21:00) [5]Там лежат (в той же последовательности)
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 байта на пиксель.
Eraser (2006-04-13 22:53:00) [6]
> Bardt (13.04.06 20:00)
TBitmap.ScanLine