Чтение TIFF-файла (Изменение программы для вывода двух изображений на ТВ-экран: одно – исходное, а другое – негативное)

Страницы работы

Содержание работы

Федеральное агентство по образованию РФ

 


Санкт-Петербургский государственный электротехнический
университет "ЛЭТИ" им. В. И. Ульянова (Ленина)

 


Кафедра телевидения и видеотехники

Отчёт по лабораторной работе №5

Чтение TIFF - файла

                                                                    Выполнил: Евстигнеев Е.

                                                                                   Осадчук С.

                                                Группа 0105

                                                                                 Преподаватель: Мончак А.М.

Санкт-Петербург

2011

Задание на  лабораторную работу

1. Изменить программу таким образом, чтобы на ТВ экран выводились два изображения: одно - исходное, а другое – негативное.

2. Постановка задачи для ЭВМ.

x

integer

y

Integer

col

Integer

Driv

integer

Mode

integer

seektiff

Integer

Size

word

Xpal

word

Ypal

word

Wdir

longint

Wx

longint

Wy

longint

f

file

ImageFile1

string

Xmax

string

Ymax

string

po

poi

c

char

NumberofTag

integer

IFDlength

integer

I

integer

Tagtype

integer

PointTyp

integer

Comp

longint

PoinAdr

longint

Head

longint

IFDInd

longint

BegIFD

longint

TiffHead

longint absolute TH

3. Текст программы:

program lab5;                        {чтение  файла  > 64 K}

uses    Graph,Crt;

const

        dx=640;  dy=480;

type

        Dim    = array[1..dx] of byte;

        DimPtr = ^Dim;

        poi   = array[1..dy] of DimPtr;

var

        x,y,col,Driv,Mode,seektiff     : integer;

        Size,Xpal,Ypal                 : word;

        Wdir,Wx,Wy                     : longint;

        f                              : file;

        ImageFile1,Xmax,Ymax           : string;

       {pal                            : palettetype;}

        po                             : poi;

        c                              : char;

PROCEDURE HeadRead;

const

        TH      :array[0..3] of byte=(73,73,42,0);

var

        NumberofTag,IFDlength          : integer;

        i,TagType,PoinTyp              : integer;

        comp,PoinAdr                   : longint;

        head,IFDInd,BegIFD             : longint;

        TiffHead                       : longint absolute TH;

Begin

    Blockread(f,head,4);        {читаем первые четыре байта -}

                                {здесь должен быть заголовок TIFF}

                 {Проверка наличия заговка TIFF - файла}

    {Обратить внимание: идет сравнение величин типа LogInt, занимающих

    4 байта. Поскольку заголовок в описании констант задан как массив

    из 4 байт, чтобы сравнение стало возможным, константу нужно

    преобразовать в тип LogInt. Для этого введена переменная TiffHead

    типа LogInt, расположенная в памяти по тому же адресу, что и

    константа TH (см.в разделе var описание этой переменной и использование

    зарезервированного слова absolute)}

    if head<>TiffHead then begin

                                writeln('Eto ne TIFF - fail');

                                Write('Takoe ne chitau!!!');

                                halt;

                           end;

    { Seek(f,8);         {переместиться на начало IFD}

    seek(f,4);

    Blockread(f,head,4); {Хед вроде больше не нужна}

    seek(f,head);

    Blockread(f,NumberofTag,2);         {Число Tag'ов в IFD}

    IFDInd:=BegIFD+2;      {установили указатель на голову первого Tag'а}

      {Читаем Tag'и и присваиваем значения соотвествующим переменным}

    for i:=1 to NumberofTag do begin

                                    Blockread(f,TagType,2);

                                    case TagType of

                                         256: begin {размер по горизонтали}

                                                   Inc(IFDInd,8);

                                                   Seek(f,IFDInd);

                                                   Blockread(f,Wx,4);

                                                   Inc(IFDInd,4);

                                              end;

                                         257: begin {размер по вертикали}

                                                   IFDInd:=IFDInd+8;

                                                   Seek(f,IFDInd);

                                                   Blockread(f,Wy,4);

                                                   Inc(IFDInd,4);

                                              end;

                                         273: begin {определение начала области данных}

                                                   IFDInd:=IFDInd+2;

                                                   Seek(f,IFDInd);

                                                   Blockread(f,PoinTyp,2); {тип записей в таблице указателей-зачем???}

                                                   IFDInd:=IFDInd+2;

                                                   Seek(f,IFDInd);

                                                   Blockread(f,comp,4);    {число записей в таблице указателей}

                                                   IFDInd:=IFDInd+4;       {смещение на область}

                                                   Seek(f,IFDInd);         {данных Tag'а}

                                    {Разбор содержимого Tag'а.

                                    Если comp=1, то таблицы нет, а единственный указатель -

                                    в самом Tag'е в области данных. Иначе в области данных

Похожие материалы

Информация о работе