Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Скашивается картинка при чтении НЕ ВСЕХ BMP-шек? 
Общую структуру формата можно посмотреть здесь: https://upload.wikimedia.org/wikipedia/commons/c/c4/BMPfileFormat.png

Цитата, на что обратить внимание: каждая строка добивается ненужными байтами чтобы длина строки была кратна 4 байтам.
Пример кода при попиксельном чтении на Си (24-битная глубина):
https://ru.wikipedia.org/wiki/BMP

Пример кода на FoxPro (считывание организовано по-другому, более похоже к считыванию "построчно"):
http://www.sql.ru/forum/819428/razlozhit-bmp-na-pikseli

Не сдержусь и процитирую тут, чтобы не потерялось, грабли, как выяснилось знатные(забыть о мусоре, т.к. картинка считалась верно.... случайно совпало с выравниванием):

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  в другой, обратите внимание на дописывание мусора в файл:
http://jenyay.net/Programming/Bmp