IMG архив — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
м (Версия 3 - GTA IV)
Строка 1: Строка 1:
В IMG архивах GTA в основном хранятся игровые модели, текстуры, транспортные и пешеходные пути, анимации, а так же [[Внешние скрипты|внешние скрипты]]. IMG архив имеет расширение .img. Эти архивы разделяются на версии и имеют схожий между собой формат (за исключением версии, используемой GTA IV).
+
В '''IMG архивах''' GTA в основном хранятся игровые модели, текстуры, транспортные и пешеходные пути, анимации, а так же [[Внешние скрипты|внешние скрипты]]. IMG архив имеет расширение <code>.img</code>. Эти архивы разделяются на версии и имеют схожий между собой формат (за исключением версии, используемой GTA 4).
  
==Структура==
+
== Структура ==
  
===Версия 1 - GTA III & VC===
+
=== Версия 1 - GTA III & VC ===
Архивы первой версии, используемые в GTA III и Vice City, разделены на два файла: директория содержимого архива '''(.dir)''' и сам архив, содержащий файлы '''(.img)'''.
+
Архивы первой версии, используемые в GTA III и Vice City, разделены на два файла: директория содержимого архива <code>.dir</code> и сам архив, содержащий файлы <code>.img</code>.
  
 
Директория содержит список файлов, их имена, смещение и размер. Изначально формат IMG оптимизировался для использования на DVD или CD, поэтому размер и смещение файлов кратны сектору DVD (2048 байт). Даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы (обычно) не сортированы, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).
 
Директория содержит список файлов, их имена, смещение и размер. Изначально формат IMG оптимизировался для использования на DVD или CD, поэтому размер и смещение файлов кратны сектору DVD (2048 байт). Даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы (обычно) не сортированы, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).
  
Чтобы найти общее количество элементов (файлов) в .img архиве, необходимо разделить размер .dir файла на 32.
+
Чтобы найти общее количество элементов (файлов) в IMG архиве, необходимо разделить размер .dir файла на 32.
  
 
Файл директории не имеет заголовка, просто массив элементов по 32 байта на каждый:
 
Файл директории не имеет заголовка, просто массив элементов по 32 байта на каждый:
Строка 18: Строка 18:
 
  24 байта  - CHAR[24] - имя файла
 
  24 байта  - CHAR[24] - имя файла
  
Сам .img архив не имеет заголовка, просто файлы, как говорилось ранее, расположенные в блоках по 2 КБ.
+
Сам IMG архив не имеет заголовка, просто файлы, как говорилось ранее, расположенные в блоках по 2 КБ.
  
 
[[Изображение:IMG_file_alloc.png|center|Схема распределения файлов в IMG архиве]]
 
[[Изображение:IMG_file_alloc.png|center|Схема распределения файлов в IMG архиве]]
  
===Версия 2 - GTA SA===
+
=== Версия 2 - GTA SA ===
Архивы второй версии, используемые в GTA San Andreas, содержат '''.dir''' и '''.img''' файлы в одном .img файле. Директория имеет такой же формат, как и в формате 1-ой версии, но располагается в начале .img файла. Файлы так же размещены в блоках по 2 КБ. Смещения файлов задаются ''от начала самого архива'', а не от конца списка файлов.
+
Архивы второй версии, используемые в GTA San Andreas, содержат <code>.dir</code> и <code>.img</code> файлы в одном IMG файле. Директория имеет такой же формат, как и в формате 1-ой версии, но располагается в начале IMG файла. Файлы так же размещены в блоках по 2 КБ. Смещения файлов задаются ''от начала самого архива'', а не от конца списка файлов.
  
 
  Заголовок:
 
  Заголовок:
Строка 38: Строка 38:
 
Недостаток этого формата - это его расширяемость. Если вы добавите слишком много файлов, директория начнёт записываться ''поверх первых файлов в архиве'', поэтому вам нужно будет записывать первые файлы в конец архива.
 
Недостаток этого формата - это его расширяемость. Если вы добавите слишком много файлов, директория начнёт записываться ''поверх первых файлов в архиве'', поэтому вам нужно будет записывать первые файлы в конец архива.
  
====Пример программы на Delphi по работе с форматом====
+
==== Пример программы на Delphi по работе с форматом ====
 
<source lang="delphi" line>
 
<source lang="delphi" line>
 
  procedure TForm1.Button1Click(Sender: TObject); //Процедура открытия архива
 
  procedure TForm1.Button1Click(Sender: TObject); //Процедура открытия архива
Строка 94: Строка 94:
  
 
===Версия 3 - GTA IV===
 
===Версия 3 - GTA IV===
Данная версия архива имеет более сложную структуру. Общим со старыми версиями, осталось только то, что файлы выравнены по размеру сектора (2048 байт).  
+
Данная версия архива имеет более сложную структуру. Общим со старыми версиями осталось только то, что файлы выравнены по размеру сектора (2048 байт).  
 
Каталог архива может быть зашифрован.
 
Каталог архива может быть зашифрован.
  
====Заголовок====
+
==== Заголовок ====
  
 
Заголовок файла всегда равен '''20 байтам'''.
 
Заголовок файла всегда равен '''20 байтам'''.

Версия 09:28, 27 января 2009

В IMG архивах GTA в основном хранятся игровые модели, текстуры, транспортные и пешеходные пути, анимации, а так же внешние скрипты. IMG архив имеет расширение .img. Эти архивы разделяются на версии и имеют схожий между собой формат (за исключением версии, используемой GTA 4).

Содержание

Структура

Версия 1 - GTA III & VC

Архивы первой версии, используемые в GTA III и Vice City, разделены на два файла: директория содержимого архива .dir и сам архив, содержащий файлы .img.

Директория содержит список файлов, их имена, смещение и размер. Изначально формат IMG оптимизировался для использования на DVD или CD, поэтому размер и смещение файлов кратны сектору DVD (2048 байт). Даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы (обычно) не сортированы, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).

Чтобы найти общее количество элементов (файлов) в IMG архиве, необходимо разделить размер .dir файла на 32.

Файл директории не имеет заголовка, просто массив элементов по 32 байта на каждый:

Элемент (повторяется n-раз, где n - общее количество элементов):

 4 байта  - DWORD	- смещение файла (в блоках) в .img архиве, относительно его начала
 4 байта  - DWORD 	- размер файла (в блоках) в .img архиве
24 байта  - CHAR[24] 	- имя файла

Сам IMG архив не имеет заголовка, просто файлы, как говорилось ранее, расположенные в блоках по 2 КБ.

Схема распределения файлов в IMG архиве

Версия 2 - GTA SA

Архивы второй версии, используемые в GTA San Andreas, содержат .dir и .img файлы в одном IMG файле. Директория имеет такой же формат, как и в формате 1-ой версии, но располагается в начале IMG файла. Файлы так же размещены в блоках по 2 КБ. Смещения файлов задаются от начала самого архива, а не от конца списка файлов.

Заголовок:

 4 байта	 - CHAR[4]	- сигнатура архива, всегда имеет значение "VER2"
 4 байта	 - DWORD	- общее количество элементов (файлов)

Элемент: (повторяется n-раз, где n - общее количество элементов):

 4 байта - DWORD     - смещение файла (в блоках) в архиве
 4 байта - DWORD     - размер файла (в блоках)
24 байта - CHAR[24]  - имя файла

Недостаток этого формата - это его расширяемость. Если вы добавите слишком много файлов, директория начнёт записываться поверх первых файлов в архиве, поэтому вам нужно будет записывать первые файлы в конец архива.

Пример программы на Delphi по работе с форматом

  1.  procedure TForm1.Button1Click(Sender: TObject); //Процедура открытия архива
  2.  var
  3.    Size, Offset, FileNum, A : Integer;
  4.    Name : PChar;
  5.    FileName : String;
  6.    ListItem : TListItem;
  7.  begin
  8.    if OpenDialog1.Execute then
  9.    begin
  10.      CFileName.Text := OpenDialog1.FileName;
  11.      Size := 0;
  12.      Offset := 0;
  13.      Name := PChar(AllocMem(24));                                 
  14.      CFileList.Clear;
  15.      FileName := OpenDialog1.FileName;
  16.      Stream := TFileStream.Create(FileName, fmOpenRead);   // Открываем архив для чтения
  17.      Stream.Seek(4, 0);   // Пропускаем первые 4 байта, так как они всегда равны "VER2"
  18.      Stream.Read(FileNum, 4);   // Считываем количество файлов
  19.      for A := 0 to FileNum - 1 do  // Цикл считывания всех файлов
  20.      begin
  21.        Stream.Read(Offset, 4);   // Считываем смещение файла
  22.        Stream.Read(Size, 4);   // Считываем размер файла
  23.        Stream.Read(Name^, 24);  // Считываем имя файла
  24.        ListItem := CFileList.Items.Add;                  //
  25.        ListItem.Caption := Name;                         // Добавляем файл со всеми 
  26.        ListItem.SubItems.Add(IntToStr(Size * 2048));     // параметрами в список файлов
  27.        ListItem.SubItems.Add(IntToStr(Offset * 2048));   // 
  28.      end;
  29.    end;
  30.  end;
  31.  
  32.  procedure TForm1.Button2Click(Sender: TObject); //Процедура извлечения файлов
  33.  var
  34.    Size, Offset : Integer;
  35.    DestFile : TFileStream;  // Сюда будем загружать файл для сохранения
  36.  begin
  37.    if CFileList.SelCount > 0 then   // Если что-либо выделено в списке файлов 
  38.     begin
  39.      SaveDialog1.FileName := CFileList.Selected.Caption;
  40.      if SaveDialog1.Execute then
  41.      begin
  42.        DestFile := TFileStream.Create(SaveDialog1.FileName, fmCreate);   // Создаём файл
  43.        DestFile.Seek(0, 0);   // Смещаемся в начало файла.
  44.        Size := StrToInt(CFileList.Selected.SubItems.Strings[0]);// Узнаём размер выделенного файла
  45.        Offset := StrToInt(CFileList.Selected.SubItems.Strings[1]);// Узнаём смещение выделенного файла
  46.        Stream.Seek(Offset, 0);  // Смещаемся к смещению (то есть, к началу) файла в архиве
  47.        DestFile.CopyFrom(Stream, Size);  // Копируем количество байт, равным размеру файла в архиве
  48.        DestFile.Free;   // Закрываем файл
  49.      end;
  50.    end;
  51.  end;

Версия 3 - GTA IV

Данная версия архива имеет более сложную структуру. Общим со старыми версиями осталось только то, что файлы выравнены по размеру сектора (2048 байт). Каталог архива может быть зашифрован.

Заголовок

Заголовок файла всегда равен 20 байтам.

4 byte - DWORD      - Идентификатор (0xA94E2A52) Если, это поле имеет другое значение, архив зашифрован
4 byte - DWORD      - Версия (всегда 3)
4 byte - DWORD      - Количество объектов
4 byte - DWORD      - Размер каталога (в байтах)
2 byte - WORD       - Размер элемента каталога (всегда должен быть равен 0x10)
2 byte - WORD       - Неизвестно

Каталог архива

Каталог архива состоит из двух частей: описателей файлов, содержащих смещение и размер файла внутри архива и имен файлов.

В начале идет массив описателей по 16 байт:

4 byte - DWORD      - Размер объекта и флаги 
4 byte - DWORD      - Версия ресурса (только для RSC, для остальных объектов не используется)
4 byte - DWORD      - Смещение от начала IMG в блоках (2048 байт)
2 byte - WORD       - Количество используемых блоков
2 byte - WORD       - Размер неиспользуемого места в последнем блоке

За описателями следуют имена файлов, разделенные '\x0', в том же порядке, что и описатели.

Чтение зашифрованных архивов

Если идентификатор архива не равен 0xA94E2A52, архив считается зашифрованным. Для чтения такого архива, следует прочитать заголовок (20 байт), но дешифровать только первые 16 байт. После этого, следует снова проверить идентификатор. Если идентификатор корректный, следует считать каталог (размер берется из расшифрованного заголовка) и дешифровать его, округлив размер до числа кратного 16, вниз. (Например, если указан размер 259 байт, дешифруются только первые 256).