Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заполнить структуру BITMAPFILEHEADER


SPeller ©   (2002-09-04 10:39:00) 

Всем доброго времени суток! Как правильно вычислить значение поля bfOffBits структуры BITMAPFILEHEADER, имея заполненную структуру BITMAPINFO и следующие за ней графические данные ??

Вот текстт процедуры в которой что-то не так делается. Знаю что не могу правильно прикрутить BITMAPFILEHEADER.

procedure TForm1.Button1Click(Sender: PObj);
var hFile, hBl, hRes, rSize, tm: cardinal; pf: pointer; bfh: TBITMAPFILEHEADER;
bih: PBITMAPINFOHEADER;
begin
hbl:=FindResource(hInstance, "FRMMAIN_IMAGELIST1", RT_BITMAP );
if hbl=0 then begin
ShowMessage("Can""""t find resource.");
exit;
end;
rSize:=SizeOfResource(hInstance, hbl);
hRes:=LoadResource(hInstance, hbl);
if hRes=0 then begin
ShowMessage("Can""""t load resource");
exit;
end;
pf:=LockResource(hres);
hfile:=CreateFile("C:\tmres.bmp", GENERIC_WRITE or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0);
bih:=pf;
bfh.bfType:=$424D;
bfh.bfSize:=rSize+SizeOf(bfh);
bfh.bfReserved1:=0;
bfh.bfReserved2:=0;

if bih.biBitCount > 8 then tm:=0 else tm:=round(exp(bih.biBitCount*ln(2)))*SizeOf(RGBQUAD);
bfh.bfOffBits:=SizeOf(bfh) + SizeOf(bih^)+ tm -1;

tm:=0;
_WriteFile(hFile, @bfh, SizeOf(bfh), tm, 0);

hbl:=Cardinal(_WriteFile(hFile, pf, rsize, tm, 0));
if hbl=0 then ShowMessage("Writing failed");
CloseHandle(hFile);
FreeResource(hRes);

end;


Tihas   (2002-09-04 19:49:00) [1]

Ну зачем ты всё измеряешь SizeOf. Думаю ты знаешь, что
размер заголовка в любом битмепе весит 54 байта, типер
остоёться вычислить размер палитры,
Если case bfOffBits of
1:s:=2;
4:s:=16;
8:s:=256;
16,24,32:s:=0;
end;
result:=4*s+54;
Вот и всё.
Удачи.


Игорь Шевченко   (2002-09-04 11:36:00) [2]

graphics.pas - TBitmap.WriteStream - может, натолкнет на какие-то идеи ?


SPeller   (2002-09-04 11:23:00) [3]

ЗЫ: Объявление _WriteFile такое:

function _WriteFile(hFile: cardinal; Buffer:pointer; BytesToWrite: cardinal; var BytesWritten: cardinal; lpOverlapped: cardinal): BOOL; stdcall;external kernel32 name "WriteFile";


Наверх

Титульная страница Поиск, карта сайта Написать письмо