Скашивается картинка при чтении НЕ ВСЕХ BMP-шек?
Общую структуру формата можно посмотреть здесь:
Цитата, на что обратить внимание: каждая строка добивается ненужными байтами чтобы длина строки была кратна 4 байтам.
Пример кода при попиксельном чтении на Си (24-битная глубина):
Пример кода на FoxPro (считывание организовано по-другому, более похоже к считыванию "построчно"):
Не сдержусь и процитирую тут, чтобы не потерялось, грабли, как выяснилось знатные(забыть о мусоре, т.к. картинка считалась верно.... случайно совпало с выравниванием):
lnFH = fopen('test.bmp')
if lnFH <= 0
? 'Файл не открылся'
return
endif
lcHead = fread(lnFH, 14) && структура BITMAPFILEHEADER
if !left(lcHead, 2) == 'BM' && первые два байта всегда 'BM'
? 'Это не BMP'
return
endif
lnOffset = ctobin(substr(lcHead, 11, 4), '4RS') && Номер байта с которого начинается сама картинка
lcHead = fread(lnFH, lnOffset - 14) && Остальной заголовок
lnWidth = ctobin(substr(lcHead, 5, 4), '4RS')
lnHeight = ctobin(substr(lcHead, 9, 4), '4RS')
? 'Размер:', lnWidth, lnHeight
for y = 1 to lnHeight
for x = 1 to lnWidth
lnR = asc(fread(lnFH, 1))
lnG = asc(fread(lnFH, 1))
lnB = asc(fread(lnFH, 1))
? "точка (", x, y, ") = RGB(", lnR, lnG, lnB, ")"
endfor
if (lnWidth * 3) % 4 != 0
fread(lnFH, (lnWidth * 3) % 4) && Пропускаем мусор для выравнивания до 4-х байт
endif
endfor
fclose(lnFH)
Пример преобразования из одного формата BMP в другой, обратите внимание на дописывание мусора в файл:
