Форум: "Media";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Media";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c