Перейти к содержимому


Фотография

TIM файлы – Формат хранения графики PSX

TIM файлы TIM Формат хранения графики PSX Формат хранения графики TBGR CLUT PSX Romhacking Ромхакинг ЗЫЧ

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 26

#1 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 10 Май 2015 - 09:16

Ранее я уже публиковал информацию по хранению несжатой графики на различных игровых системах. Теперь подошла очередь и до Sony PlayStation.

Сам я начал недавно разбираться, как же всё же устроены TIM файлы для PlayStation. Поэтому надеюсь на помощь экспертов, если я где-то что-то упущу или перепутаю. Так же буду приводить свои догадки, какие могут оказаться не верными.

Для начала немного общей информации

 

В файлах формата *.TIM чаше всего в играх и программах для PSX хранится графическое изображение, проще говоря, картинка / рисунок / фотография. Судя по всему, имеется четыре распространенных формата хранения данных:

 

4-bit (color indices)

8-bit (color indices)

16-bit (actual colors)

24-bit (actual colors)

 

Возможно, есть и другие, так сказать авторские.

 

Заголовок занимает 20 байт, дальше идут данные изображения. Байты хранятся в перевёрнутом виде.

 

TIM 4-bit (color indices)

TIM 8-bit (color indices)

TIM 16-bit (actual colors) [TBGR / A1B5G5R5]

TIM 24-bit (actual colors) [RGB / R8G8B8]

TIM файл с несколькими палитрами (4-bit и 8-bit)

 

Дополнительная информация:

Quake II Текстуры (Графика) [PSX]


  • 4

#2 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 10 Май 2015 - 09:34

TIM 16-bit (actual colors) [TBGR / A1B5G5R5]

В самом устройстве TIM нет ничего сложного, кроме формата хранения (присвоения) палитры пикселю.

post-95-0-96266300-1431242323.png

В качестве примера будем рассматривать прикрепленный файл SPIN.TIM. Это изображение размером 188x24.

 

post-95-0-52397200-1431242324.png

Вид в Hex-редакторе.

 

post-95-0-74151100-1431242324.png

Константа (постоянное значение), видимо для обозначения, что это формат TIM.

Первые 4 байта можно назвать константой = 0x10000000. (Дополнение от TTEMMA)

 

 

post-95-0-96945600-1431242324.png

Следующие 4 байта, обозначают какого типа (формата) будут данные (будет TIM файл). В нашем случае это 16-bit (A1B5G5R5).

Следующие 4 байта = тип изображения: (Дополнение от TTEMMA)

  • 0x08 = 4-bit
  • 0x09 = 8-bit
  • 0x02 = 16-bit
  • 0x03 = 24-bit

 

post-95-0-15252900-1431242325.png

Размер файла. Отсчёт начинает с 8h. То есть с того место, где начинается информация об изображении. Данные хранятся в перевёрнутом виде. Размер данных составляет 0x234C (отсчёт с $8 до $2353 включительно). В файле данные имеют вид 4C 23. Для нормального восприятия нужно переставить байты местами. Сделав это, мы получим 23 4C, собственно говоря, это и есть размер данных.

 

post-95-0-36720000-1431242325.png

Ширина (длинна) изображения в пикселях по X. У нас оно составляет 188 пикселей. Что соответствует в байтах 00 BC. В файле данное значение записано как BC 00. То есть в перевёрнутом виде.

 

post-95-0-58220700-1431242325.png

Высота изображения в пикселях по Y. У нас оно составляет 24 пикселя. Что соответствует в байтах 00 18. В файле данное значение записано как 18 00. То есть в перевёрнутом виде.

 

Всё остальное данные (с 14h) это пиксели идущие друг за другом.

 

post-95-0-16272100-1431242324.png

Один пиксель состоит из двух байт.

 

Дальше начинается самое сложное. Данные хранятся в  виде (порядке) TBGR (Transparency, Blue, Green, Red (Прозрачность, Синий, Зелёный, Красный)) / A1B5G5R5. Сначала идёт бит устанавливающий прозрачность. Затем на каждый из цветов приходится по 5 бит. Таким образом, мы имеем 15-bit RGB (R5 G5 B5).

 

post-95-0-85044600-1431242301.png

Поскольку данные в файле хранятся в перевёрнутом виде, чтобы с ними работать их нужно перевести в нормальный вид. В файле один пиксель записан как 18 63. Меняем байты местами и получаем 63 18. С этими данными нам и предстоит работать.

 

post-95-0-52160300-1431242302.png

Дальше нам предстоит работать с битами.

post-95-0-32078300-1431242302.png

В битах данные имеют следующий вид:

0 11000 11000 11000

 

Теперь нужно преобразовать эту информацию в RGB.

post-95-0-07691800-1431242302.png

Для лучшего восприятия 5 битам приписываем 3 нулевых бита в начало.

 

Было:

11000

 

Стало:

00011000

 

Теперь 8 бит, преобразовываем в цифры.

 

00011000 = 24

 

И это число нужно умножить на 8.

 

24 * 8 = 192

 

post-1-0-60919300-1431244867.jpg

Теперь остаётся вписать данные на своё место и мы получим цвет пикселя. В данном случае это один из оттенков серого.

Прикрепленные изображения

  • color.jpg
  • bayt.png
  • BGR convert.png
  • bit RGB.png
  • bits.png
  • tim psx.png
  • pixel.png
  • tim hex.png
  • tim hex 1.png
  • tim hex 2.png
  • tim hex 3.png
  • tim hex X.png
  • tim hex Y.png

Прикрепленные файлы

  • Прикрепленный файл  SPIN.7z   203байт   352 Количество загрузок:

  • 4

#3 Diablo

Diablo

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 379 сообщений

Отправлено 10 Май 2015 - 09:56

SPOT, большое спасибо за предоставленную информацию, даже я понял, о чём идёт речь. Информация подана очень хорошо и понятно. Продолжайте в том же духе.


  • 1

#4 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 10 Май 2015 - 14:28

В начале слегка неверно, первые 4 байта можно назвать константой = 0x10000000
Следующие 4 байта = тип изображения:
  • 0x08 = 4-bit
  • 0x09 = 8-bit
  • 0x02 = 16-bit
  • 0x03 = 24-bit
Дальше идёт информация либо о палитре(если 4 или 8 битное изображение), либо о самом изображение(16 или 24 битное изображение).
Структура палитры такова:
  • 4 байта = размер палитры + 0x0C
  • 2 байта = VramX
  • 2 байта = VramY
  • 2 байта = Ширина
  • 2 байта = Высота
  • Сама палитра
Следом после палитры идёт информация о изображении:
  • 4 байта = размер изображения + 0x0C
  • 2 байта = VramX
  • 2 байта = VramY
  • 2 байта = Ширина
  • 2 байта = Высота
  • Само изображение
Так же, кол-во палитр в файле означает высота.(Если 4 или 8 битное изображение).
Есть ещё нюансы по ширине и изображения:
4 битное изображение
  • Ширина = Ширина * 4
8 битное изображение
  • Ширина = Ширина * 2

Вроде, пока что, всё :)
  • 4

#5 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 12 Май 2015 - 07:46

TTEMMA, спасибо за информацию. Внёс правки.

 

Что такое VramX и VramY? Это типа куда в видеопамять записать данный элемент, так почему по осям? Или потому что в PSX данные во Vram хранятся в пикселях, а не в тайлах как например в SMD.


  • 3

#6 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 12 Май 2015 - 12:44

TIM 4-bit (color indices)

Этот принцип хранения данных и построения изображения схож с принципом хранения графических данных в 16-битных игровых системах.

post-95-0-07714300-1431426279.png

В качестве примера мы будем рассматривать TIM файл CALLSIGN.TIM из игры Twisted Metal 2. Данный файл я прикреплю к сообщению. Это изображение размером 128x64.

post-95-0-61559600-1431426278.png

Вид в Hex-редакторе.

 

post-95-0-23307900-1431426279.png

Константа дающая понять, что это TIM файл.

 

post-95-0-41239800-1431426279.png

Следующие 4 байта, обозначают какого типа (формата) будет TIM файл. В нашем случае это 4-bit (color indices).

 

post-95-0-52318700-1431426279.png

Далее идёт информация о палитре. (Напомню, что данные хранятся в перевёрнутом виде)

Структура палитры такова:

  • 4 байта = размер палитры + 0x0C
  • 2 байта = VramX
  • 2 байта = VramY
  • 2 байта = Ширина
  • 2 байта = Высота
  • Сама палитра

 

post-95-0-18064400-1431426772.png

Размер данных относящихся к палитре. 0x2C то есть 44 байта, 32 байта из которых занимает сама палитра. По 2 байта на 1 цвет. Всего 16 цветов. Скорее всего, 0x2C000000 можно считать константой. Не думаю, что тут может быть какое-то другое значение.

 

post-95-0-33160400-1431426278.png

2 байта = VramX

 

post-95-0-99278100-1431426287.png

2 байта = VramY

 

post-95-0-23285000-1431426288.png

2 байта = Ширина

 

post-95-0-10735800-1431426288.png

Количество палитр. В данном случае одна палитра.

(2 байта = Высота)

 

post-95-0-35448800-1431426288.png

Палитра. Данные занимают 32 байта. По 2 байта на один цвет. Палитра хранится в формате TBGR / A1B5G5R5. Данные хранятся в перевёрнутом виде.

 

post-95-0-49394400-1431426288.png

Первый цвет.

 

post-95-0-50264600-1431426278.png

Поскольку данные хранятся в перевёрнутом виде, для визуального восприятия их нужно перевернуть. То есть было FF 7F, а мы его перевернули и получили 7F FF.

 

Дальше мне лень повторяться и писать, как узнать какому цвету соответствует данное значение. Нужно просто действовать точно так же как и в случае с TIM 16-bit (actual colors) [TBGR / A1B5G5R5].

 

post-95-0-67968500-1431426288.png

Размер, занимаемый данными изображения плюс 0x0C.

4 байта = размер изображения + 0x0C

Данные хранятся в перевёрнутом виде 0C 10 00 00. Для нормального восприятия их нужно перевернуть. Перевернув их, мы получим 00 00 10 0C.

 

post-95-0-81216700-1431426288.png

2 байта = VramX

 

post-95-0-92843200-1431426288.png

2 байта = VramY

 

post-95-0-18618100-1431426289.png

Ширина (длинна) изображения в пикселях по X. У нас оно составляет 128 пикселей. В файле данное значение записано как 20 00. То есть в перевёрнутом виде. Мы должны перевернуть это значение 00 20. Преобразовав 00 20 в десятичную систему счисления, мы получим значение 32. Теперь данное значение нужно умножить на 4.

 

32 * 4 = 128

 

Вот мы и получили ширину в пикселях.

 

post-95-0-05802800-1431426289.png

Высота изображения в пикселях по Y. У нас оно составляет 64 пикселя. Что соответствует в байтах 00 40. В файле данное значение записано как 40 00. То есть в перевёрнутом виде.

 

Начиная с 40h идут данные самого изображения. Метод хранения схож с методом хранения несжатой графики в GBA.

 

post-95-0-94228300-1431426278.png

Один пиксель занимает пол байта, то есть 4 бита. Значение от 0 до F, что соответствует от 1 до 16. Палитра состоит из 16 цветов. Каждому цвету соответствует значение из 4 бит.

 

post-95-0-77537400-1431426278.png

Данные хранятся в перевёрнутом виде. Сначала идёт второй пиксель, а потом первый.

Прикрепленные изображения

  • tim hex 5 VramX.png
  • byte convert.png
  • hex vid.png
  • pixel 2.png
  • pixel 4 bits.png
  • ris.png
  • tim hex 1 const.png
  • tim hex 2 tip file.png
  • tim hex 3 palinfo.png
  • tim hex 5 VramY.png
  • tim hex 6 H.png
  • tim hex 6 Shirina.png
  • tim hex 7 pal 16.png
  • tim hex 8 cvet.png
  • tim hex 9 razmer info.png
  • tim hex 10 VramX.png
  • tim hex 10 VramY.png
  • tim hex 11 H izob.png
  • tim hex 11 Shir izob.png
  • tim hex 4 razpal.png

Прикрепленные файлы

  • Прикрепленный файл  CALLSIGN.7z   882байт   330 Количество загрузок:

  • 3

#7 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 12 Май 2015 - 16:44

Честно, точно не знаю для чего VramX, VramY. Вроде, расположение TIM в видеопамяти, но я не уверен.

Потом, в статье о 16-bit 2 раза повторяется "Следующие 4 байта".

Потом в статье по 4 байта, где вы говорите, мол размер палитры можно считать константой - надо исправить, ибо размер палитры может быть и меньше, это зависит от изображения. Так же, не забывайте, что в файле может быть несколько палитр. На кол-во палитр указывают последние 2 байта(Высота).

К примеру, возьмём шрифт из RE2.

1.png

0xAC - Размер палитры в целом, то бишь 0х14+A0 = начала блока с информацией об изображении.(размер, высота, ширина и т.д.)

0x05 - Кол-во палитр в файле.

Следовательно, 0x20 на каждую палитру.

К примеру, если выбрать 2 палитру, то цвет текста с белого меняется на зелёный.

2.png


  • 1

#8 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 12 Май 2015 - 18:17

TIM 8-bit (color indices)

post-95-0-93114900-1431445901.png

В качестве примера мы будем рассматривать TIM файл CAB_CARD.TIM из игры Twisted Metal 2. Данный файл я прикреплю к сообщению. Это изображение размером 128x64.

 

post-95-0-77904600-1431445901.png

Вид в Hex-редакторе.

 

post-95-0-95184500-1431445891.png

Константа дающая понять, что это TIM файл.

 

post-95-0-10573700-1431445892.png

Следующие 4 байта, обозначают какого типа (формата) будет TIM файл. В данном случае это 8-bit (color indices).

 

post-95-0-26418100-1431445892.png

Размер данных относящихся к палитре. 0x2C то есть 524 байта, 512 байта из которых занимает сама палитра. По 2 байта на 1 цвет. Всего 256 цветов.

 

post-95-0-47088100-1431445892.png

2 байта = VramX (для палитры)

 

post-95-0-72956200-1431445892.png

2 байта = VramY (для палитры)

 

post-95-0-21535000-1431445893.png

2 байта = Ширина (для палитры)

 

post-95-0-06383700-1431445893.png

Количество палитр. В данном случае одна палитра.

(2 байта = Высота (для палитры))

 

post-95-0-59605700-1431445901.png

Палитра. Данные занимают 200 байта. По 2 байта на один цвет. Всего 256 цветов. Палитра хранится в формате TBGR / A1B5G5R5. Данные хранятся в перевёрнутом виде.

 

post-95-0-90075100-1431445892.png

Первый цвет.

 

Как определить какому цвету соответствуют данные читайте в TIM 16-bit (actual colors) [TBGR / A1B5G5R5].

 

post-95-0-67577100-1431445891.png

Размер, занимаемый данными изображения плюс 0x0C.

4 байта = размер изображения + 0x0C

Данные хранятся в перевёрнутом виде 0C 20 00 00. Для нормального восприятия их нужно перевернуть. Перевернув их, мы получим 00 00 20 0C.

 

post-95-0-99521500-1431445900.png

2 байта = VramX (для изображения)

 

post-95-0-13384700-1431445901.png

2 байта = VramY (для изображения)

 

post-95-0-82543500-1431445900.png

Ширина (длинна) изображения в пикселях по X. У нас оно составляет 128 пикселей. В файле данное значение записано как 40 00. То есть в перевёрнутом виде. Мы должны перевернуть это значение 00 40. Преобразовав 00 40 в десятичную систему счисления, мы получим значение 64. Теперь данное значение нужно умножить на 2.

 

32 * 2 = 128

 

Вот мы и получили ширину в пикселях.

 

post-95-0-69289100-1431445900.png

Высота изображения в пикселях по Y. У нас оно составляет 64 пикселя. Что соответствует в байтах 00 40. В файле данное значение записано как 40 00. То есть в перевёрнутом виде.

 

post-95-0-24394900-1431445901.png

Один пиксель занимает 8 бит или, проще говоря, равен одному байту.

 

Счёт идёт от 00 до FF, то есть всего 256 значений.

post-95-0-41900200-1431445901.png

Прикрепленные изображения

  • hex 5 raz ris.png
  • hex 1 const.png
  • hex 2 tip tim.png
  • hex 3 pal info.png
  • hex 3 pal VramX.png
  • hex 3 pal VramY.png
  • hex 4 pal  1 col.png
  • hex 4 pal H.png
  • hex 4 pal Shir.png
  • hex 6 H ris.png
  • hex 6 Shir ris.png
  • hex 6 VramX ris.png
  • hex 6 VramY ris.png
  • hex 7 pixel.png
  • hex 8 ff.png
  • hex pal 256.png
  • hex vid.png
  • riz tm2.png

Прикрепленные файлы

  • Прикрепленный файл  CAB_CARD.7z   6,63К   336 Количество загрузок:

  • 5

#9 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 12 Май 2015 - 18:46

мол размер палитры можно считать константой - надо исправить, ибо размер палитры может быть и меньше,

Мне кажется, что размер всё же фиксированный. Для 4-bit (color indices) это палитра из 16 цветов. Для 8-bit (color indices) это 256 цветов.

 

 

Так же, не забывайте, что в файле может быть несколько палитр.

Вот это нужно изучить :)

 

Кто знает в какой игре есть TIM в формате 24-bit (actual colors)?


  • 1

#10 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 12 Май 2015 - 18:52

Мне кажется, что размер всё же фиксированный.

Только кажется, размер зависит от кол-во палитр и типа изображения.


  • 0

#11 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 12 Май 2015 - 19:12

TTEMMA, Скинь (залей) файл из RE2, где несколько палитр используется. Если не сложно.


  • 0

#12 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 12 Май 2015 - 19:15

Да, конечно.
1 файл - 4 битное

2 файл - 8 битное

Прикрепленный файл  font0.zip   95,1К   318 Количество загрузок:


  • 1

#13 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 13 Май 2015 - 08:19

TIM файл с несколькими палитрами (4-bit и 8-bit)

Кратко рассмотрим вариант с несколькими палитрами в TIM файлах. В начале идёт значение указывающие на количество палитры в файле, затем разными цветами выделена палитра.

 

4-bit (color indices)

post-95-0-70152100-1431497848.png

 

8-bit (color indices)

post-95-0-36427300-1431497848.png

Прикрепленные изображения

  • tim pal  8 bit.png
  • tim pal.png

  • 5

#14 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 15 Май 2015 - 08:42

Ещё раз повторю вопрос:

 

Кто знает в какой игре есть TIM в формате 24-bit (actual colors)?


  • 1

#15 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 15 Май 2015 - 09:12

Вот пример.

Прикрепленные файлы

  • Прикрепленный файл  TIM 24.rar   180,65К   336 Количество загрузок:

  • 2

#16 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 15 Май 2015 - 19:13

Вот пример.

Благодарю.

А данный формат (24-bit (actual colors)) в играх для PSX встречается? Или он для PS2?


  • 1

#17 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 15 Май 2015 - 19:36

Встречается, редко, но встречается.

В PS2 идёт уже tm2(TIM2)


  • 1

#18 SPOT

SPOT

    Продвинутый пользователь

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 16 Май 2015 - 08:45

24-bit (actual colors) [RGB / R8G8B8]

Заголовок (первые 20 байт) имеют точно такое же значение, как и в случае с TIM 16-bit (actual colors). Поэтому рассматривать данные значения не будем.

 

post-95-0-22765600-1431758506.png

За исключением обозначения ($4) 0x03000000. Данные байты указывает на то, что это 24-bit (actual colors).

 

post-95-0-84729800-1431758506.png

С 14h ($14) хранится набор пикселей. Один пиксель занимает 3 байта. В отличие от предыдущих вариантов. Данные здесь хранятся не в перевёрнутом виде.

 

post-95-0-07808700-1431758507.png

По сравнению с 16-bit (actual colors) тут всё просто. Данные идут подряд в RGB и на каждый из цветов приходится по 8 бит (R8 G8 B8), то есть по одному байту.

 

post-95-0-30275400-1431758507.png

Переводим байты в десятичную систему счисления.

E9 = 233

D4 = 212

B5 = 181

 

post-95-0-55149800-1431758506.jpg

Теперь вписываем данные на свои места и получаем исходный цвет.

Прикрепленные изображения

  • tim pixel.png
  • tim color.jpg
  • tip tim.png
  • tim rgb.png
  • tim rgb2.png

  • 4

#19 zetper

zetper

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений
  • ГородМосква

Отправлено 29 Август 2015 - 14:39

Опишите пожалуйста метод хранения графики в TIM2 если нужны примеры файлов здесь они есть rutracker.org/forum/viewtopic.php?t=4514120

SPOT твои объяснения о хранению несжатой графики о очень просто и понятны,СПАСИБО ТЕБЕ БОЛЬШОЕ за них.


  • 1

#20 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 01 Сентябрь 2015 - 07:31

Опишите пожалуйста метод хранения графики в TIM2 если нужны примеры файлов здесь они есть rutracker.org/forum/viewtopic.php?t=4514120

SPOT твои объяснения о хранению несжатой графики о очень просто и понятны,СПАСИБО ТЕБЕ БОЛЬШОЕ за них.

gtamodding.ru/wiki/TIM2


  • 0





Темы с аналогичным тегами TIM файлы, TIM, Формат хранения графики PSX, Формат хранения графики, TBGR, CLUT, PSX, Romhacking, Ромхакинг, ЗЫЧ

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru Яндекс.Метрика