Форум: "Основная";
Текущий архив: 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