Скашивается картинка при чтении НЕ ВСЕХ 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 в другой, обратите внимание на дописывание мусора в файл: