Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.051 c
9-1138783225
Nic
2006-02-01 11:40
2006.11.26
Выбор компилятора Delphi при создании игры


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


6-1152286144
Abelo
2006-07-07 19:29
2006.11.26
Обмен файлами через TIdHTTP и TIdHTTPServer


6-1152187270
Ildar
2006-07-06 16:01
2006.11.26
Ошибка 1332 - Пользователям не сопоставлены коды защиты данных


15-1163131418
Slider007
2006-11-10 07:03
2006.11.26
С днем рождения ! 10 ноября





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский