Главная страница
    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.046 c
1-1160743014
dreamse
2006-10-13 16:36
2006.11.26
Перекрытие формой другой формы


15-1162589696
ZiTRaX
2006-11-04 00:34
2006.11.26
Turbo Delphi Explorer


8-1144966315
Alpine
2006-04-14 02:11
2006.11.26
Как очистить IMAGE ?


2-1162467307
Juju
2006-11-02 14:35
2006.11.26
Теряются пути...


2-1162884446
Alex_AA
2006-11-07 10:27
2006.11.26
Изменение формата представления чисел





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский