Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Вниз

структура 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1086747507
Думкин
2004-06-09 06:18
2004.06.27
С днем рождения! 9 июня


14-1086811730
Infeligo
2004-06-10 00:08
2004.06.27
Какой софт использовать для зелёного экрана?


14-1086036446
KilkennyCat
2004-06-01 00:47
2004.06.27
Забугорная жизнь впереди.


1-1087007130
Aswert
2004-06-12 06:25
2004.06.27
Как объявить структуру константой ?


1-1086510761
Программер
2004-06-06 12:32
2004.06.27
Тени, полупрозрачные окна и скриншоты экрана





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