Главная страница
    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.039 c
2-1156158641
apic
2006-08-21 15:10
2006.11.26
1024 компонента


15-1162578731
TUser
2006-11-03 21:32
2006.11.26
Свобода собраний


3-1158742757
tor84
2006-09-20 12:59
2006.11.26
Переместить данные из dbf(866) в Access


6-1152097394
Dstr
2006-07-05 15:03
2006.11.26
Передача файла на множество компов на IndyUDP


3-1159181529
kaif
2006-09-25 14:52
2006.11.26
Как в ADO SQL-запросе указать дату?





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