Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Форматы файлов и данных > Движение по матрице BMP


Автор: Artemon 22.12.2006, 16:17
Есть BMP файл, задача по координатам (X,Y) получить смещение относительно начала, либо конца файла.

Что-то ни как не могу сообразить.

Автор: maxim1000 22.12.2006, 16:22
bmp разные бывают
тут надо смотреть, какой формат (24 бита, 8 и т.д.)

Добавлено @ 16:26 
во... нашёл:
http://forum.vingrad.ru/index.php?showtopic=94227&view=findpost&p=717911

Автор: Artemon 22.12.2006, 17:14
не сжатый 24bit.

но дело не в этом, вопрос не в формате, а втом как преобразовать заданные координаты в смещение относительно начала или конца.

P.S.
    Этот вопрос должен находиться в алгоритмах, а не в форматах, и я очень буду рад, если вы его туда переместите.

Автор: maxim1000 22.12.2006, 17:59
1. находим номер первого пиксела нужной строки
2. находим номер нужного пиксела

(1)
сдвигаемся от конца файла вверх на Y*<количество байт в записи строки>
вверх потому, что у bmp обратный порядок записи строк (сначала нижние)
количество байт строки - 3*<ширина в пикселах>+delta
delta - 0,1,2 или 3, подбирается так, чтобы длина строки в байтах была кратна 4-м
(2)
сдвигаем на 3*X в сторону конца файла (здесь уже порядок более привычный - сначала левые, потом правые)


Цитата(Artemon @  22.12.2006,  16:14 Найти цитируемый пост)
Этот вопрос должен находиться в алгоритмах, а не в форматах, и я очень буду рад, если вы его туда переместите.

не буду спорить с тем, что здесь есть что-то алгоритмическое, но слишком много тонкостей, специфичных конкретно для bmp, к алгоритмам эти детали особо-то и не относятся

если бы вопрос стоял "матрица записана построчно в файл (ну или одномерный массив), найти смещение элементы с указанными индексами", я бы тему не переносил...

так что просто одна часть перевесила другую...

Автор: chyapay 19.1.2007, 18:15
блин 2 пальца об асфальт:
 X В ДИАПАЗОНЕ ОТ 0 ДО XWIDTH-1
 Y В ДИАПАЗОНЕ ОТ 0 ДО YWIDTH-1

Тогда:
IF WIDTH MOD 4 = 0 THEN
OFFSET:=(WIDTH*Y+X)*COLOR_DEPTH DIV 8  //COLOR_DEPTH=4,8,16,24,32
ELSE
OFFSET:=((((WIDTH DIV 4) +1)*4)*Y+X)*COLOR_DEPTH DIV 8;

вот как просто!

Добавлено @ 18:16 
а и еще:
OFFSET:=OFFSET+IMG_BEGIN_OFFSET; // добавить после исчислений.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)