Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » ASP, Perl, PHP и MySQL

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.
Цитата:
TYPE
map=RECORD
r:byte; {RED – красный цвет}
g:byte; {GREEN – зеленый цвет}
b:byte; {BLUE – синий цвет}
res:byte; {Резервное поле}
end;
image=RECORD
{Заголовок файла}
bm:word; {Код 4D42h - Буквы 'BM'}
size:longint; {Размер файла}
res1:word; {0, Резервное поле}
res2:word; {0, Резервное поле}
smesh:longint; {Смещение, с которого начинается само изображение}
{Информационный заголовок}
sizeinfo:longint; {Размер информационного заголовка}
widht:longint; {Ширина изображения в пикселях}
hight:longint; {Высота изображения в пикселях}
kpl:word; {Количество плоскостей}
glcolor:word; {Глубина цвета}
kompression:longint; {Компрессия}
szhatie:longint; {0 или размер сжатого изображения}
horisontal:longint; {Горизонтальное разрешение, пиксель/метр}
vertical:longint; {Вертикальное разрешение, пиксель/метр}
color:longint; {Количество используемых цветов}
colordefault:longint; {Количество основных цветов}
{Палитра}
palitra:longint; {Палитра}
colorMap:array[0..255] of map
end;
2. Создана переменная описанного типа (buffer). Описана файловая переменная для нетипизированного файла.
Цитата:
VAR
buffer:image;
bmp:file;
path:string; {путь к файлу}
3. Программа.
Цитата:
BEGIN
Возможность пользователя ввести путь к файлу с клавиатуры
Цитата:
WRITE(‘Введите путь к BMP файлу: ’); READLN(path);
Связываем файловую переменную с именем файла, введенным пользователем:
Цитата:
ASSIGN(bmp,path);
Открываем файл для чтения. Определяем длину буфера:
Цитата:
RESET(bmp);
SIZEOF(image);
Читаем одну запись из файла с помощью команды BLOCKREAD:
Цитата:
{НЕ ЗНАЮ!}
Теперь нужно проверить, имеет ли указанный пользователем файл формат BMP. Для этого нужно проанализировать поле BM записи IMAGE. Если в нем находится 4D42h,то файл имеет формат BMP. Если BMP – то продолжить.
Цитата:
IF {???? } THEN
BEGIN
{ПРОДОЛЖЕНИЕ КОДА НИЖЕ - ***}
END;
Закрыть файл. Нужно выбрать другой буфер для чтения, а для этого придется от-крыть файл заново:
Цитата:
{begin ***}
CLOSE(bmp);
RESET(bmp);
Теперь необходимо перейти в графический режим и установить палитру, т.е. ука-зать сколько красного, зеленого и синего должно содержаться в каждом цвете. Для начала установить 256-цветный графический режим с разрешением 800х600 точек.
Цитата:
{НЕ ЗНАЮ!}
Теперь должны установить палитру. Мы уже прочитали в поле COLORMAP записи BUFFER всю палитру, осталось ее установить. Для это необходимо организовать цикл от 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).
Цитата:
{НЕ ЗНАЮ ВООБЩЕ!}
{end ***}
-----------------------------------------------------------
Выполните задержку смены экрана, например, с помощью пустого цикла Repeat Un-til KeyPressed;
Цитата:
KeyPressed;
END.
ПОМОГИТЕ ПЛИЗ!!!!!!!

P.S. Могу прислать все задание. Без кусков кода программы.
[/font]
 
Старый 06.02.2004, 14:15
Ссылки
Старый 06.02.2004, 23:10   #2
Цитата:
P.S. Могу прислать все задание. Без кусков кода программы.
dimka_sh, кинь мне на мыло - [email protected] or [email protected]
Я посмотрю в выходные и сделаю.
Вообще имхо ты слишком гиморно начал - такой record... проще работать с бмпшкой напрямую, имхо.
Ну вообщем присылай - жду!!!

З.Ы. А можно на Дельфи? Там с графикой работать проще
 
Старый 06.02.2004, 23:10
Закрытая тема


Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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


Текущее время: 01:56. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Дизайнерский форум