Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Кодер формата TIFF


Автор: vanya_z 30.11.2006, 10:34
Мне нужно написать на языке Си кодер формата tiff. Попробовал написать программу создающую файл tiff, в котором находится изображение RGB 128x128. Но что-то не получается. Прошу помочь найти причину или готовые примеры по аналогичной теме. 

Код

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main()
{FILE *stream;
stream=fopen("tif.tif","wb");
//HEADER
    struct Header{
    short BYTE_ORDER;    //Порядок следования файлов
    short VERSION;        //Hомер версии TIFFa
    long  IFDOffset;            //Адрес первой директории TAGов
                };    
    struct Header s;

    s.BYTE_ORDER=0x4949;    //Порядок следования файлов
    s.VERSION=0x002A;        //Hомер версии TIFFa
    s.IFDOffset=8;            //Адрес первой директории TAGов
    

    fwrite(&s,sizeof(s),1,stream);
//IFD    
    short   NumDirEntries=12;            // Количество тегов в IFD
    fwrite(&NumDirEntries,sizeof(NumDirEntries),1,stream);
    //short   TagList[];            // Массив тегов
struct IFD{
    short  Tagid;            // Идентификатор тега
    long   Datatype;        // Скалярный тип элементов данных 
    short  DataCount;            // Количество элементов данных тега
    long   DataOffset;        // Смещение элементов данных
            };
struct IFD c;

      c.Tagid=256;            // Идентификатор тега ImageWidth
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=128;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=257;            // Идентификатор тега ImageLength
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=128;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=258;            // Идентификатор тега BitsPerSample
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=8,8,8;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=259;            // Идентификатор тега Compression
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=1;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=262;            // Идентификатор тега PhotometricInterpretation
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=2;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=273;            // Идентификатор тега StripOffsets
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=174;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=277;            // Идентификатор тега SamplesPerPixel
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=3;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=278;            // Идентификатор тега RowsPerStrip
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=4;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=279;            // Идентификатор тега StripByteCounts
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=128*12;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=282;            // Идентификатор тега XResolution
      c.Datatype=5;            // Скалярный тип элементов данных 
      c.DataCount=1;        // Количество элементов данных тега
      c.DataOffset=158;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=283;            // Идентификатор тега YResolution
      c.Datatype=5;            // Скалярный тип элементов данных 
      c.DataCount=1;        // Количество элементов данных тега
      c.DataOffset=166;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);

      c.Tagid=296;            // Идентификатор тега ResolutionUnit
      c.Datatype=3;            // Скалярный тип элементов данных 
      c.DataCount=1;            // Количество элементов данных тега
      c.DataOffset=2;        // Смещение элементов данных

        fwrite(&c,sizeof©,1,stream);
int g;
        g=96;
        fwrite(&g,sizeof(int),1,stream);
        g=1;
        fwrite(&g,sizeof(int),1,stream);
        g=96;
        fwrite(&g,sizeof(int),1,stream);
        g=1;
        fwrite(&g,sizeof(int),1,stream);
        

long NextIFDOffset=0;  // Смещение следующей IFD

fwrite(&NextIFDOffset,sizeof(NextIFDOffset),1,stream);

int b=0x80;
    for(int k=0;k<3;k++)
        for(int i=0;i<128;i++)
                for(int j=0;j<128;j++)
                    fwrite(&b,sizeof(char),1,stream);

fclose(stream);
}



M
alexeis1
Модератор: У нас на форуме есть возможность делать подсветку кода, при промощи кнопки "КОД" справа выше поля ввода

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