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

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

структура BMP-файла [D7, WinXP]


PenguinX ©   (2004-06-14 12:40:00) 

Доброго времени суток!
Допустим, имеем код:
----------------------
type artype = array [0..0] of Byte;
    arptr = ^artype;
    mBMPFileHeader = record
      BMType: Word;
      Size: DWORD;
      Reserved1, Reserved2: Word;
      OffsetBits: DWORD;
    end;
    mBMPInfoHeader = packed record
      Size: DWORD;
      Width: Longint;
      Height: Longint;
      Planes: Word;
      BitCount: Word;
      Compression: DWORD;
      SizeImage: DWORD;
      XpelsPerMeter: Longint;
      YpelpPerMeter: Longint;
      ColorsUsed: DWORD;
      ColorsImportant: DWORD;
    end;
    mBMPHeader = record
      FH: mBMPFileHeader;
      IH: mBMPInfoHeader;
      ColorTable: array [0..255, 0..3] of Byte;
    end;

function BMPLoadFromFile(FileName: string; Image: artype): byte;
var BMPFile: file;
   I: Integer;
   H: mBMPHeader;
   X, Y: Word;
   S: Longint;
begin
Result := 0;
AssignFile(BMPFile, FileName);
if not FileExists(FileName) then begin
Result := 1;
Exit;
end else begin
try
Reset(BMPFile);
except
Result := 2;
Exit;
end;
try
BlockRead(BMPFile, H, SizeOf(H)); //<< Вылетает здесь!
except
Result := 3;
Exit;
end;
try
for I := 0 to (H.IH.Width * H.IH.Height) - 1 do begin
BlockRead(BMPFile, Image[(Y - I - 1) * X], X);
if (X mod 4) <> 0 then BlockRead(BMPFile, S, 4 - (X mod 4));
end;
except
Result := 4;
Exit;
end;
end;
end;
----------------------
Почему при вызове процедуры BMPLoadFromFile прога вылетает в указанном месте(типа испорченный заголовок BMP): ошибка в описании структуры BMP-файла или в другом?


GuAV   (2004-06-15 00:45:00) [1]

Dimaxx   (14.06.04 23:11) [17]

[2]
> а лучше не извращайся, а юзай, что прописано в windows.pas

понимать можно по разному - и так, что юзай стд функции, и по твоему :)


Dimaxx   (2004-06-14 23:11:00) [2]

Все заголовки описаны в windows.pas - так что нечего городить огород на асфальте. :-)


Romkin   (2004-06-14 18:19:00) [3]

GuAV ©   (14.06.04 17:50) [15] :)))
Ну остальные случаи - постепенно... Глядишь, уже и твой код гораздо больше "мусорным" станет, чем у windows ;)


GuAV   (2004-06-14 17:50:00) [4]

Ну вот, мастера пришли, мне пора заткнуться :)

Romkin ©   (14.06.04 17:24) [13]
не нравится мне это описание не совместимо с BITMAPV4HEADER, BITMAPV5HEADER. Size 4 bytes Size of InfoHeader =40 - а ведь не всегда.
Хотя претензий к авторам нет, т.к. предупредили
"This is not the official format documentation"

Palladin ©   (14.06.04 17:39) [14]
Имхо, Ваша правда.


Palladin   (2004-06-14 17:39:00) [5]


> PenguinX ©   (14.06.04 14:24)

У тебя гораздо больше оснований быть мастдайчиком чем у Windows.


Romkin   (2004-06-14 17:24:00) [6]

Можно же просто поискать BMP file format,
http://www.daubnet.com/formats/BMP.html


GuAV   (2004-06-14 14:43:00) [7]

забыл напомнить - палитра для BITMAPCOREINFO  из Triple для BITMAPINFOHEADER+ из Quad - или может не быть вообще.


GuAV   (2004-06-14 14:41:00) [8]

> предположи BITMAPCOREHEADER, а если WIDTH и HEIGHT = 0,
> то значит там BITMAPFILEHEADER, прочитай ещё DWORD   bfOffBits

Виноват, это бред, но в целом идея в силе.
сначала:
BitmapFileHeader; затем
BITMAPCOREINFO  / BITMAPINFOHEADER (или BITMAPV4,V5HEEADER - в зав. от Size);
затем палитра; затем (по смещению указанному в BitmapFileHeader) - строки из пикселей, dword-aligned.
Собственно всё. Дерзай :)


PenguinX   (2004-06-14 14:24:00) [9]


> GuAV ©
как вариант - читай всеь файл в буфер, а потом смотри-разбирай что прочитал, имхо быстрее всего будет.

1. А если файл достаточно велик(например с размерами 1600 на 1600 и 32-битной палитрой)? Ведь это сравнительно большая трата памяти.
2. Это не избавляет меня от проблем, связанных со структурой BMP-файла.
Если Вы знаете правильное описание структуры и вариантов её ПРАВИЛЬНОЙ обработки, пожалуйста, помогите мне.

> GuAV ©   (14.06.04 13:28) [8]
>> загрузить его в HDC, не используя при этом мастданых ф-ий?
>
>сомневаюсь

Но ведь мастдайка же это делает!

Всем! Всем! Всем!
Пожалуйста, помогите в составлении вышеуказанной ф-ии!


GuAV   (2004-06-14 13:39:00) [10]


> можно.

только не одним recordом, вариантные по длине кусочки идут подряд, значит их смещение тоже вариантно, а значит variant parts in record не очень помогут, можно только до mBMPInfoHeader (включ-но), и то, имхо, не очень хорошо.

как вариант - читай всеь файл в буфер, а потом смотри-разбирай что прочитал, имхо быстрее всего будет.


GuAV   (2004-06-14 13:28:00) [11]


> Так знает кто-нибудь как правильно описать структуру для
> любого BMP-файла


> не используя при этом мастданых ф-ий?

можно.

> загрузить его в HDC, не используя при этом мастданых ф-ий?

сомневаюсь.


GuAV   (2004-06-14 13:27:00) [12]

PenguinX ©   (14.06.04 13:20) [5]
Тогда учти многообразие форматов Bitmap, читай Size, по нему определяй заголовок, аналогично с палитрой, она может быть меньше, см. clouds.bmp, читай её длниу.
Т.е. сначала предположи BITMAPCOREHEADER, а если WIDTH и HEIGHT = 0, то значит там BITMAPFILEHEADER, прочитай ещё DWORD   bfOffBits, ну и т.д., а не читай одним движением.


PenguinX   (2004-06-14 13:26:00) [13]

Так знает кто-нибудь как правильно описать структуру для любого BMP-файла и затем загрузить его в HDC, не используя при этом мастданых ф-ий?


PenguinX   (2004-06-14 13:20:00) [14]


> GuAV ©   (14.06.04 13:04) [2]
...а лучше не извращайся, а юзай, что прописано в windows.pas

Это не есть нужный мне вариант. Я хотел перенести всё это на асму и чуть-чуть подредатировать на "низком уровне". Этот код - всего лишь "пример", отрывок из будущей большой библиотеки для работы с графикой. Я посмотрел дебаггером некоторые мастдайные ф-ии по работы с BITMAP'ами и был поражён наличием большого кол-ва всякого мусора в них. IMHO, если написать самому ПРАВИЛЬНО, то работать должно быстрее.


GuAV   (2004-06-14 13:17:00) [15]

А что собственно нужно?
может работа с TBitmap лучше подойдёт.
B:=TBitmap.Create;
B.LoadFromFile(... );


PenguinX   (2004-06-14 13:08:00) [16]


> GuAV ©   (14.06.04 12:55) [1]
> ...и вообще: весь код - бред.

Как по-вашему можно его исправить?


GuAV   (2004-06-14 13:04:00) [17]


> и вообще: весь код - бред.

я к тому, что в этом слишком много предположений.

>     mBMPHeader = record
>       FH: mBMPFileHeader;
>       IH: mBMPInfoHeader;
>       ColorTable: array [0..255, 0..3] of Byte;
>     end;

mBMPInfoHeader - его размер не факт, что такой смотри Size: DWORD, и читай именно столько.

ColorTable: array [0..255, 0..3] of Byte - может быть и меньше
или не быть вообще.

Короче, имхо, вариант проходит, когда создаёшь, когда открываешь - будь готов принять всё, а лучше не извращайся, а юзай, что прописано в windows.pas


GuAV   (2004-06-14 12:55:00) [18]


>       ColorTable: array [0..255, 0..3] of Byte;

не факт. тем более, что в твоём случае скорее RGBQuad.
файл не закрываешь.
mBMPFileHeader
бывают с "core-заголовками"
и вообще: весь код - бред.


Наверх

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