Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

структура BMP-файла   Найти похожие ветки 

 
PenguinX ©   (2004-06-14 12:40) [0]

Доброго времени суток!
Допустим, имеем код:
----------------------
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-14 12:55) [1]


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

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


 
GuAV ©   (2004-06-14 13:04) [2]


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

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

>     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


 
PenguinX ©   (2004-06-14 13:08) [3]


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

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


 
GuAV ©   (2004-06-14 13:17) [4]

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


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


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

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


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

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


 
GuAV ©   (2004-06-14 13:27) [7]

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


 
GuAV ©   (2004-06-14 13:28) [8]


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


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

можно.

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

сомневаюсь.


 
GuAV ©   (2004-06-14 13:39) [9]


> можно.

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

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


 
PenguinX ©   (2004-06-14 14:24) [10]


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

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

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

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

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


 
GuAV ©   (2004-06-14 14:41) [11]

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

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


 
GuAV ©   (2004-06-14 14:43) [12]

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


 
Romkin ©   (2004-06-14 17:24) [13]

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


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


> PenguinX ©   (14.06.04 14:24)

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


 
GuAV ©   (2004-06-14 17:50) [15]

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

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]
Имхо, Ваша правда.


 
Romkin ©   (2004-06-14 18:19) [16]

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


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

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


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

Dimaxx   (14.06.04 23:11) [17]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.035 c
1-1086951900
BillyJeans
2004-06-11 15:05
2004.06.27
TreeView


1-1086777144
_alex_
2004-06-09 14:32
2004.06.27
Параметры функций в dll


3-1086001980
ossa
2004-05-31 15:13
2004.06.27
Покажите ссылки на статьи или документация по работе с Ораклом


3-1086042763
OBA
2004-06-01 02:32
2004.06.27
Удаление табл. в Interbase/Firebird


14-1086723074
Petr V. Abramov
2004-06-08 23:31
2004.06.27
Текст лицензии на FIBPlus для юр.лиц и для физ лиц.