Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

*.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 вся ветка

Форум: "Media";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.037 c
6-1111769393
Radgar
2005-03-25 19:49
2005.06.14
Активность у массива TServerSocket


4-1114411459
Mihas
2005-04-25 10:44
2005.06.14
Как прочитать из окна WINWORD Текст документа?


4-1114071026
Stanislav
2005-04-21 12:10
2005.06.14
Как дождаться уничтожения MUTEXa


3-1115720609
GreatMaster
2005-05-10 14:23
2005.06.14
Так как через ADO общаться с DBF в кодировке 1251?


14-1116827557
syte_ser78
2005-05-23 09:52
2005.06.14
Проблемы с DrDivx 1.06





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский