Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

*.TGA и Timage   Найти похожие ветки 

 
seregka   (2005-02-24 17:25) [0]

Помогите, пожалуйста!
Нужно вставить *.tga и *.tiff  файлы в Image, но их как изображение он не понимает.

что делать.

Конвертацию в jpg не предлагать, т.к. предстоит работа с большим количеством файлов


 
Sphinx   (2005-02-25 19:33) [1]

{==============================================================
примечания:                                                       1) работает только с несжатыми графическими данными
 2) изображения должны иметь глубину цвета 24 или 32 бита на пиксель
 3) не поддерживается прозрачность при загрузке в TBitmap
===============================================================}

unit uTtga;

interface

uses
 Windows,
 Classes,
 Graphics,
 SysUtils;

{==============================================================
 структуры данных
==============================================================}

type
 { вспомогательные записи }
 _array_char18 = array[0..17] of Char;
 _array_char41  = array [0..40]  of Char;
 _array_char324 = array [0..323] of Char;

 { заголовок файла формата TGA }
 _tga_header = packed record
   IDLength        : Byte;   // длинна описательной части файла
   ColorMapType    : Byte;   // тип палитры файла
   ImageType       : Byte;   // тип хранимого изображения
   ColorMapOffset  : Word;   // начальный бит палитры
   ColorMapLength  : Word;   // длинна палитры
   ColorMapDepth   : Byte;   // количество цветов в палитре
   XOffset         : Word;   // смещение изображения по оси Х
   YOffset         : Word;   // смещение изображения по оси У
   Width           : Word;   // ширина изображения
   Height          : Word;   // высота изображения
   ColorDepth      : Byte;   // глубина цвета
   Description     : Byte;   // маркер
 end;
{===============================================================
 заголовок файла идентичен для версий TGA v1.0 и TGA v2.0

 основное отличае между версиями форматов - наличае в v2.0
 дополнительных данных и несколько инная запись графических координат точек

 для поля ColorMapType возможны следующие значения:
 0 - палитра отсутствует;
 1 - изображение хранит палитру;
 инное - допускается, это означает что файл создан для каких-то
         специализированных целей с применением собственного формата;

 для поля ImageType возможны следующие значения:
 0  - в файле не содержится графических данных;
 1  - файл содержит изображение с палитрой
      (ColorDepth при этом 4 или 8);
 2  - файл содержит изображение без палитры
      (ColorDepth при этом 24 или 32);
 3  - файл содержит монохромное изображение;
 9  - файл содержит изображение с палитрой (данные сжаты);
 10 - файл содержит изображение без палитры (данные сжаты);
 11 - файл содержит монохромное изображение (данные сжаты);
===============================================================}

 { "нижний заголовок" формата TGA v2.0 }
 _tga_footer = packed record
   ExtensionOffset : DWord;      // смещение расширенного раздела
   DeveloperOffset : DWord;      // смещение раздела разработчиков
   Signature       : _array_char18; // описание формата
 end;
{===============================================================
 располагается в конце файла;
 длинна блока данных 26 байт.
===============================================================}

 { данные разработчика формата TGA v2.0 }
 _tga_tag = packed record
   TagID       : Word;       // уникальный номер
   DataOffset  : DWord;      // смещение области данных тэга
   DataLength  : DWord;      // размер области данных тэга
 end;
{===============================================================
 уникальный номер может принимать значения от 0 до 32767
 диапазон от 32768 до 65535 зарезервирован TreuVision для своих нужд;
 длинна блока данных 10 байт.  
===============================================================}

 { область расширенных данных формата TGA v2.0 }
 _tga_extension = packed record
   Length            : Word;           // размер расширенной области
   AutorName         : _array_char41;  // имя автора
   AutorComment      : _array_char324; // авторский коментарий
   StampMonth        : Word;           // месяц создания/модификации файла
   StampDay          : Word;           // день создания/модификации файла
   StampYear         : Word;           // год создания/модификации файла
   StampHour         : Word;           // час создания/модификации файла
   StampMinute       : Word;           // минута создания/модификации файла
   StampSecond       : Word;           // секунда создания/модификации файла
   JobName           : _array_char41;  // имя разработки для которой выполняется файл
   JobHour           : Word;           // продолжительность работы в часах
   JobMinute         : Word;           // продолжительность работы в минутах
   JobSecond         : Word;           // продолжительность работы в секундах
   SoftwareID        : _array_char41;  // программа-создатель
   VersionNumber     : Word;           // версия программы-создателя
   VersionLetter     : Byte;           // символ программы-создателя
   KeyColor          : Cardinal;       // фоновый цвет изображения
   PixelNumerator    : Word;           // числитель пикселей
   PixelDenominator  : Word;           // знаменатель пикселей
   GammaNumerator    : Word;           // числитель палитры
   GammaDenominator  : Word;           // знаменатель палитры
   ColorOffset       : DWord;          // смещение таблицы коррекции данных
   StampOffset       : DWord;          // смещение до данных "почтовой марки"
   ScanOffset        : DWord;          // смещение до данных "растровой строки"
   AttributesType    : Byte;           // атрибуты изображения
 end;


 
Sphinx   (2005-02-25 19:35) [2]

{===============================================================
 размер расширенной области должен быть равен 495 байтам;

 фоновый цвет изображения - это цвет которым закрашивается подложка
     пустого изображения, этот цвет используется для заливки прозрачных
     участков изображения, по умолчанию устанавливается значение = 0
     (что соответствует черному цвету);

 PixelNumerator, PixelDenominator - содержат данные о степени сжатии
     изображения, если изображение несжато - то оба значения = 0;

 GammaNumerator, GammaDenominator - значения исправлений гаммы изображения,
     если данные не содержат гамму, то оба значения = 0;

 ColorOffset - таблица коррекции цветов, если в файле отсутствует
     таблица коррекции цветов, то это значение = 0;

 StampOffset - смещение до данных "почтовой марки", включенной в файл TGA v2.0
     если "почтовая марка" в файле отсутствует - это значение = 0;

 ScanOffset - смещение до данных "растровой стороки", если "растровая строка"
     в файле отсутствует - это значение = 0;

 AttributesType - указывают содержит ли изображение альфа канал, если поле
     имеет значение 00h - то изображение не содержит альфа-канала,
     значения 01h, 02h, 04h и 08h указывают на наличае альфа-канала;

 в файле формата TGA v2.0 может присутствовать только одна дополнительная
     структура (!) или "почтовая марка", или "растровая строка", или таблица
     корректировки цветов;

     Таблица растровой строки - метод обратиться к строкам развертки в любом
     местоположении в пределах необработанных или сжатых данных изображения.
     Таблица - массив значений DWORD. Каждое значение - местоположение
     смещения с начала файла к началу соответствующей строки развертки
     в данных изображения. Данные записаны в таблице в порядке,
     в котором строки развертки появляются в изображении.

     Изображение "почтовой марки" - меньшее исполнение первичного изображения,
     сохраненное в пределах TGA файла. Первый байт данных "почтовой марки"
     определяет ширину штампа в пикселах, и второй байт определяет высоту,
     также в пикселах. "Почтовые марки" не должны быть большими
     чем 64x64 пикселя, обычно сохраняются в том же самом формате что и
     первичное изображение, и никогда не сжимаются.

     Таблица коррекции цвета - массив 1000 байтов в длине, которая содержит
     256 входов, имел обыкновение сохранять значения, используемые
     для цветного переотображения.
===============================================================}


 
Sphinx   (2005-02-25 19:36) [3]

{ формат данных таблицы коррекции цветов }
 _tga_colorcorrectiontable = packed record
   Alpha  : Word;
   Red    : Word;
   Green  : Word;
   Blue   : Word;
 end;

 { записи формата пикселя }
 _bgra = packed record
   B:  Byte;
   G:  Byte;
   R:  Byte;
   A:  Byte;
 end;
 _bgr = packed record
   B:  Byte;
   G:  Byte;
   R:  Byte;
 end;
 TARGB = packed record
   Alpha  : Word;
   Red    : Word;
   Green  : Word;
   Blue   : Word;
 end;
 TRGB = packed record
   Red    : Word;
   Green  : Word;
   Blue   : Word;
 end;

 { массивы под данные пикселей }
 _bgra_array  = array of array of _bgra;
 _bgr_array   = array of array of _bgr;
 TARGBArray   = array of array of TARGB;
 TRGBArray    = array of array of TRGB;
 _dword_array = array of array of DWord;

 { записи содержащие графические данные }
 TCustomBGRAPic = packed record
   Width  : Word;
   Height : Word;
   DATA   : _bgra_array;
 end;
 TCustomBGRPic = packed record
   Width  : Word;
   Height : Word;
   DATA   : _bgr_array;
 end;
 TCustomARGBPic = packed record
   Width  : Word;
   Height : Word;
   DATA   : TARGBArray;
 end;
 TCustomRGBPic = packed record
   Width  : Word;
   Height : Word;
   DATA   : TRGBArray;
 end;
 TCustomDWordPic = packed record
   Width:  Word;
   Height: Word;
   DATA:   _dword_array;
 end;

{==============================================================================
 постоянные величины программы
==============================================================================}

const
 { коды ошибок выполнения процедур и функций }
 ErrTTGANoError     = 0;  // ошибки отсутствуют
 ErrTTGAFileNotFind = 1;  // не найден файл с изображением
 ErrTTGAInvalidFile = 2;  // файл содержит неверное изображение

 { размер расширенной области данных }
 _tga_extension_length = 495;

var
 { описание формата TGA v2.0 }
 _true_footer: _array_char18 = ("T","R","U","E","V","I","S","I","O","N","-","X","F","I","L","E",".",#0);

{ функции экспортируемые из файла }
function ColorToBGRA (Color: TColor): _bgra; forward;
function ColorToBGR (Color: TColor): _bgr; forward;
function BGRAToColor (Color: _bgra): TColor; forward;
function BGRToColor (Color: _bgr): TColor; forward;
function BGRAToDWord (Color: _bgra): DWord; forward;
function BGRToDWord (Color: _bgr): DWord; forward;

function LoadTGAToBmp(FileName: String; DestBMP: TBitmap): Integer; forward;
function LoadTGAToCanvas(FileName: String; DestCanvas: TCanvas): Integer; forward;
function LoadTGAToArrayBGRA (FileName: String; out DestArray: TCustomBGRAPic): Integer; forward;
function LoadTGAToArrayDWORD (FileName: String; out DestArray: TCustomDWordPic): Integer; forward;


 
Sphinx   (2005-02-25 19:37) [4]

implementation

{==============================================================================
 преобразование типа TColor в структуру ARGB
==============================================================================}

function ColorToBGRA (Color: TColor): _bgra;
begin
 Result.R := Color and $FF;
 Result.G := (Color and $FF00) shr 8;
 Result.B := (Color and $FF0000) shr 16;
 Result.A := 255;
end;

{==============================================================================
 преобразование типа TColor в структуру RGB
==============================================================================}

function ColorToBGR (Color: TColor): _bgr;
begin
 Result.R := Color and $FF;
 Result.G := (Color and $FF00) shr 8;
 Result.B := (Color and $FF0000) shr 16;
end;

{==============================================================================
 преобразование структуры ARGB в тип TColor
==============================================================================}

function BGRAToColor (Color: _bgra): TColor;
begin
 Result := (Color.B shl 16) or (Color.G shl 8) or Color.R;
end;

{==============================================================================
 преобразование структуры RGB в тип TColor
==============================================================================}

function BGRToColor (Color: _bgr): TColor;
begin
 Result := (Color.B shl 16) or (Color.G shl 8) or Color.R;
end;

{==============================================================================
 преобразование структуры ARGB в целочисленную величину
==============================================================================}

function BGRAToDWord (Color: _bgra): DWord;
begin
 Result := (Color.A shl 24) or (Color.B shl 16) or (Color.G shl 8) or Color.R ;
end;

{==============================================================================
 преобразование структуры RGB в целочисленную величину
==============================================================================}

function BGRToDWord (Color: _bgr): DWord;
begin
 Result := (Color.B shl 16) or (Color.G shl 8) or Color.R ;
end;

{==============================================================================
 загрузка графических данных из файла фомата .tga в переменную типа TBitmap
==============================================================================}

function LoadTGAToBmp(FileName: String; DestBMP: TBitmap): Integer;
var
 TGA_Stream  : TFileStream;
 TGAHeader   : _tga_header;
 FWidth      : Word;
 FHeight     : Word;
 bgr         : _bgr;
 bgra        : _bgra;
 tga_footer  : _tga_footer;
 TGAVers     : Byte;
 CurrentPOS  : Int64;
begin
 { проверка существования файла }
 if not (FileExists(FileName))
 then
   begin
     Result := ErrTTGAFileNotFind;
     Exit;
   end;

 { создание вспомогательных переменных }
 TGA_Stream := TFileStream.Create (FileName, fmOpenRead, fmShareDenyWrite);

 { чтение заголовка файла }
 TGA_Stream.Read(TGAHeader, SizeOf(TGAHeader));

 { проверка версии файла TGA }
 CurrentPOS := TGA_Stream.Position;
 TGA_Stream.Seek(TGA_Stream.Size - SizeOf (tga_footer), soFromBeginning);
 TGA_Stream.Read(tga_footer, SizeOf (tga_footer));
 TGA_Stream.Position := CurrentPOS;
 if tga_footer.Signature = _true_footer
 then
   TGAVers := 2
 else
   TGAVers := 1;

 { проверка соответствия файла знакомому формату }
 if (TGAHeader.ImageType <> 2) or
    ((TGAHeader.ColorDepth <> 24) and (TGAHeader.ColorDepth <> 32))
 then
   begin
     Result := ErrTTGAInvalidFile;
     TGA_Stream.Free;
     Exit;
   end;

 { установка размеров изображения }
 DestBMP.Width := TGAHeader.Width;
 DestBMP.Height := TGAHeader.Height;

 { перемещение на позицию данных }
 TGA_Stream.Position := TGA_Stream.Position + TGAHeader.IDLength;

 { чтение графических данных }
 for FHeight := 0 to TGAHeader.Height - 1 do
   for FWidth := 0 to TGAHeader.Width -1 do
     begin
       if TGAHeader.ColorDepth = 24
       then
         begin
           TGA_Stream.Read(bgr, SizeOf(bgr));
           if TGAVers = 1
           then
             begin
               DestBMP.Canvas.Pixels[FWidth, FHeight] := BGRToColor(bgr);
             end
           else
             begin
               DestBMP.Canvas.Pixels[FWidth, TGAHeader.Height - FHeight - 1] := BGRToColor(bgr);
             end;
         end
       else
         begin
           TGA_Stream.Read(bgra, SizeOf (bgra));
           if TGAVers = 1
           then
             begin
               DestBMP.Canvas.Pixels[FWidth, FHeight] := BGRAToColor(bgra);
             end
           else
             begin
               DestBMP.Canvas.Pixels[FWidth, TGAHeader.Height - FHeight - 1] := BGRAToColor(bgra);
             end;
         end;

     end;

 { очистка вспомогательных переменных }
 TGA_Stream.Free;
 Result := ErrTTGANoError;
end;


 
Sphinx   (2005-02-25 19:40) [5]

Всё это самопально е много лишнего...сделано побыстрому на коленке под свои нужды...эх...не ужержусь ведь...скажу "РАЗГРЕБАЙ САМ ПОЖАЛУЙСТА" :)

а использовать примерно так:

procedure TForm1.Button2Click(Sender: TObject);
var
 BMP:  TBitmap;
begin
 if Edit1.Text <> ""
 then
   begin
     BMP := TBitmap.Create;
     LoadTGAToBmp(Edit1.Text, BMP);
     Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
     Image1.Picture.Bitmap := BMP;
     Image1.Update;
     BMP.Free;
   end;
end;


 
Sphinx   (2005-02-26 16:20) [6]

Ах да, забыл сказать...
данных для глубины цвета = 16 бит не нашел и поэтому не знаю как при этом хранятся данные в формате 5-6-5, 5-5-5-1, 1-5-5-5 или с палитрой не знаю...эксперементировать не хотелось, мне проще переконвертировать фотошопом в 24 бита.



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
4-1114110316
Алекс
2005-04-21 23:05
2005.06.14
help plz


3-1115632015
GanibalLector
2005-05-09 13:46
2005.06.14
Вариант расчета остатков на указанную дату


3-1115124624
Andarko
2005-05-03 16:50
2005.06.14
Вычисляемое поле?


1-1116949818
Karlson
2005-05-24 19:50
2005.06.14
Как Hintу в Comboboxе присвоить текущее активное значение?


3-1115367763
xmed
2005-05-06 12:22
2005.06.14
Paradox без DBE( XP pro )