|
help me (pascal, нетипизированные файлы)Обсуждение темы help me (pascal, нетипизированные файлы) в разделе ASP, Perl, PHP и MySQL, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; [font=courier new] 1. Создан тип запись(RECORD), который включает в себя все BMP файла. Поля длиной в 2 байта описаны, как WORD; поля длиной ... |
|
Опции темы |
06.02.2004, 14:15 | #1 | |||||||||||||
|
[font=courier new]
1. Создан тип запись(RECORD), который включает в себя все BMP файла. Поля длиной в 2 байта описаны, как WORD; поля длиной 4 байта, как LONGINT. Поле палитры (карты цветов)(ColorMap) описан как массив [0..255], состоящий из элементов типа MAP. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
R G B R G B ----------------------------------------- | 10 | 20 | 90 | | 50 | 20 | 70 | | ----------------------------------------- На каждый цвет отводится 4 байта: синий оттенок, зеленый оттенок, красный оттенок, и зарезервированный байт. Каждый цвет – это элемент типа MAP. Всего элементов 256 (0..255), все они образую массив COLORMAP. Теперь внутри цикла мы должны извлекать нужный оттенок и сохранять его в палитре. Установка цвета в палитре выполняется с помощью процедуры SETRGBPALETTE. Формат процедуры имеет следующий вид: SETRGBPALETTE(ColNUM, RED DIV 4, GREEN DIV 4, BLUE DIV 4), где ColNUM – это номер цвета, который мы устанавливаем (мы должны устано-вить последовательно все 256 цветов, поэтому эта команда должна выполняться в цикле). RED,GREEN,BLUE – интенсивность красной, зелёной и синей составляющей цвета, которую вы прочитали из палитры. Обратите внимание: в памяти оттенки (В, G, R) хранятся не в том порядке, в котором они заносятся в процедуру (R, G, В). Видно , что значение каждой составляющей делится на 4. Это сделано вот почему: в DOS-e каждому номеру цвета соответствует 4 цвета палитры RGB. To есть, например, оттенки цвета 0; 1; 2 и 3 в DOS будут считаться одним оттен-ком: 0 (т.к. при делении на 4 все эти числа дают 0 целых); оттенки цвета 4; 5; 6 и 7 будут считаться оттенком 1 (т.к. при делении на 4 эти числа дают 1 целую). То есть практически в DOS-палитре получается не 256, а 256 div 4, т.е. 64 цвета. Остальные оттенки игнорируются. Вот почему и вы должны полу-ченные вами значения оттенков делить на 4. Цитата:
Вывод изображения на экран. Теперь мы знаем, из каких оттенков состоит каждый цвет, и можем приступать к выводу изображения на экран. Для ка-ждого пикселя изображения в файле отводится 1 байт (т.е. 8 бит, а зна-чит, 28 как раз дадут 256 вариантов цветов). Таким образом, мы должны последовательно прочитать каждый байт из файла и вывести на экран точ-ку тем цветом, который мы прочитали. Изображение сохраняется в BMP-файле построчно СНИЗУ-ВВЕРХ. Для хранения каждой строки выделяется кратное 4 количество байт. В незначащих байтах хранится «мусор». Т.е. если, например, ширина рисунка 253 пикселя, то для каждой строки в файле будет отведено не 253, а 256 байт, т.к. 253 не делится на 4, а 256 - да. Причём в байтах 254-256 может храниться всё что угодно и это нужно учесть, чтобы случайно не вывести этот «мусор» на экран. Поэтому первое, что вы должны сделать на этом этапе, это определить длину строки с учётом того, что она должна быть кратна 4. Ширину картинки вы можете взять из поля «Ширина изображения в пикселях». Теперь вам нужно определить, делится ли это число на 4. Если нет, то найти следующее за ним число, кратное четырём. Это и будет настоящая длина каждой строки в файле. Откройте файл для чтения. Длину буфера установите равной 1 байту, т.к. мы будем считывать из файла по одному пикселю и сразу же выводить его на экран. Надеюсь, вы не забыли, что само изображение на-ходится не в самом начале файла, а после заголовков и карты цветов. Узнать смещение, начиная с которого располагается изображение можно, обратившись к полю «Смещение, с которого начинается само изображение». Передвиньте указатель в файле на это количество байт с помощью команды SEEK. Раз изображение представляет собой прямоугольник, то для вывода его на экран придётся воспользоваться вложенными циклами: во внешнем цикле мы будем перемещаться по строкам (от 1 до «Высота изображения в пикселях»), а во внутреннем - по столбцам (от 1 до той длины строки, которую вы определили). Что же должно находиться в теле цикла? Здесь вы долж-ны читать 1 байт из файла с помощью команды BlockRead. Затем вы смотрите, че-му равно текущее смещение в строке: если оно меньше или равно полю «Ширина изображения в пикселях», то вы выводите пиксель на экран, если больше, то это уже «мусор» и пропускаете этот шаг. Вывод точки на экран можно выполнить, на-пример, с помощью такой команды: PutPixel 0, GetMaxY-i, buferi); iTiej - ко-ордината X (j берётся из счётчика внутреннего цикла); (GetMaxY - I ) - коор-дината Y (функция GetMaxY возвращает высоту экрана в пикселях. I вычитается из GetMaxY потому что изображение в файле хранится начиная с нижней строки, а начало координат в Турбо Паскале находится в левом верхнем углу экрана.); buferi - это переменная, в которую был прочитан цвет текущего пикселя по ко-манде BIockRead. Закройте файл (команда CLOSE). Цитата:
Выполните задержку смены экрана, например, с помощью пустого цикла Repeat Un-til KeyPressed; Цитата:
P.S. Могу прислать все задание. Без кусков кода программы. [/font] |
|||||||||||||
|
06.02.2004, 23:10 | #2 | |
|
Цитата:
Я посмотрю в выходные и сделаю. Вообще имхо ты слишком гиморно начал - такой record... проще работать с бмпшкой напрямую, имхо. Ну вообщем присылай - жду!!! З.Ы. А можно на Дельфи? Там с графикой работать проще |
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Pascal срочно | dimka_sh | ASP, Perl, PHP и MySQL | 0 | 24.12.2004 20:26 |
pascal | dimka_sh | Кальянная | 2 | 20.03.2004 07:21 |
Pascal | dimka_sh | ASP, Perl, PHP и MySQL | 1 | 01.03.2004 23:54 |
pascal | dimka_sh | ASP, Perl, PHP и MySQL | 5 | 06.02.2004 15:58 |
Файлы не открываются! | savage | HTML, CSS, JavaScript | 4 | 25.08.2003 19:11 |
Реклама на форуме
Условия размещения рекламы
Биржа ссылок
Заработай на сайте!
|