LINUX.ORG.RU

TGA + RLE + Gimp = не понимаю

 , , , ,


1

1

Суть вот две картинки из 4х пикселей RGB порядок с лева на право с верху вниз

  • б белый
  • ч чёрный
[б][ч]
[ч][б]
xxd -g 1 norle.tga;#картинка без RLE
00000000: 00 00 02 00 00 00 00 00 00 00 02 00 02 00 02 00  ................
00000010: 18 20 ff ff ff 00 00 00 00 00 00 ff ff ff 00 00  . ..............
00000020: 00 00 00 00 00 00 54 52 55 45 56 49 53 49 4f 4e  ......TRUEVISION
00000030: 2d 58 46 49 4c 45 2e 00                          -XFILE..

xxd -g 1 rle.tga#картинка с RLE
00000000: 00 00 0a 00 00 00 00 00 00 00 02 00 02 00 02 00  ................
00000010: 18 20 01 ff ff ff 00 00 00 01 00 00 00 ff ff ff  . ..............
00000020: 00 00 00 00 00 00 00 00 54 52 55 45 56 49 53 49  ........TRUEVISI
00000030: 4f 4e 2d 58 46 49 4c 45 2e 00                    ON-XFILE..

Тут

00000000: 00 00 0a 00 00 00 00 00 00 00 02 00 02 00 02 00  ................
00000010: 18 20

Это TGA заголовок где третий байт 02 указывает что это TRUE COLOR NO RLE. А 0a что это TRUE COLOR + RLE Далее 11+12 это размеры по икс, а 13-14 размеры по y 2x2 пикселя итого 4 я великий математик

18 это битность цвета равная (R=8+G=8+B=8) = 24 бита или 3 байта на блок данных которые будет кодировать RLE.

Далее 20 это солянка из бит в байте, тут указывается что данные идут с лева на право с верху в низ. Всё понятно?

Далее следующий байт в без RLE картинке это собсна и есть данные цвета вот они

00000010: 18 20 ff ff ff  00 00 00   00 00 00  ff ff ff
          *  * [R  G  B] [R  G  B ] [R  G  B ][ R  G  B]

Всё что дальше не важно.

А вот теже данные но типа с RLE

00000010: 18 20 01 ff ff ff 00 00 00 01 00 00 00 ff ff ff
          *  * RLE [ DATA ] ?????????????????????????????
                           [ DATA? ][RLE][DATA ] [ DATA ]

Тут сразу за 0x20 идёт 01 что как бы значит что ага у нас один блок данных из 24 бит или 3ёх байт

01 ff ff ff
RLE BLOCK [RLE_LEN=01 RLE_DATA= ff ff ff

Так как данные чередуются то они кодируются от 1 до 127, если есть нечередующийся блок то он кодируется от -1 до -127, при декодировании достаточно убрать знаковый бит и получить число. Но тут этого не надо это так для справки если я сам правильно понял.

Ну так вот ребята а дельше идёт 00 00 00 эммм ну ОК если у нас следующий блок за 01 ff ff ff равен нулю то эмм значит он и есть часть блока и надо его тоже добить нулями до 3 байт, ладно, прыгаем вперёд уже не на 4 байта (RLE=1+COLOR_BITS=3) а на просто 3. И читаем 01 00 00 00 ага у нас один блок данных из трёх нулевых байт. Сразу вопрос какого хрена это и предыдущее просто не 02 00 00 00 тоесть не 2 блока по 3 нулевых байта тоесть 6 нулевых? А вместо этого чехорда. Ок идём дальше, а там ff ff ff 00 мы знаем размер картинки уже это 2x2 и это последний 24 битный блок, но мы в месте первого ff ожидаем RLE значение последовательности. Короче я чего то не понимаю ни хе ра. Картинка тривиальная из 4х пикселей там где RLE по сути избыточен, но если он задан данные должены обрабатываться именно как RLE последовательность. Только вот хрень какато…. И да на просто чёрной или белой картинке такие же приколы хотя там то всё должно быть вообще по красоте, но нет там тоже есть места где 00 00 00 вылазят на който хер отдельно вместо кодирования вместе с другими данными.

Да я в курсе что xxd показывает мне например 0x86 как длину последовательности 134 блока по 3 байта (3=R8G8B8), но на деле это выше 127 значит надо убрать знаковый бит и получить длину последовательности 6 блоков по 3 байта (3=R8G8B8) Но в примере этого нет так как и так разбор как я всё это понимаю растянулся.

Ну так вот друзья, чё за жопка? Что я не так понимаю? Можете сами взять картинку побольше 8на8 например, нарисовать на одной половине просто цветом одим, а на второй попеременным там или как удобно сохранить как c RLE так и без. Посмотреть на обе через xxd и увидеть приколы, как оно закодировано. Тут так, а тут сяк.

Бррррррррр, https://www.youtube.com/watch?v=vlUe8ciyh4w

P.S. Я хрен знает какие теги ставить вычистили всё блин rle, tga поставить не даёт. Кто там все теги вычистил и нахрена?

ЧЯДНТ?

UDP: Результат работ тут https://github.com/orangeduck/Corange/pull/73 кому надо

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 5)

Письмо на спичечную фабрику тхт.

anonymous
()

Run-length encoded (RLE) images comprise two types of data elements: Run-length Packets and Raw Packets.

The first field (1 byte) of each packet is called the Repetition Count field. The second field is called the Pixel Value field. For Run-length Packets, the Pixel Value field contains a single pixel value. For Raw Packets, the field is a variable number of pixel values.

The highest order bit of the Repetition Count indicates whether the packet is a Raw Packet or a Run-length Packet. If bit 7 of the Repetition Count is set to 1, then the packet is a Run-length Packet. If bit 7 is set to zero, then the packet is a Raw Packet.

The lower 7 bits of the Repetition Count specify how many pixel values are represented by the packet. In the case of a Run-length packet, this count indicates how many successive pixels have the pixel value specified by the Pixel Value field. For Raw Packets, the Repetition Count specifies how many pixel values are actually contained in the next field. This 7 bit value is actually encoded as 1 less than the number of pixels in the packet (a value of 0 implies 1 pixel while a value of 0x7F implies 128 pixels).

То есть в твоём примере,

01 ff ff ff 00 00 00 01 00 00 00 ff ff ff

01 — старший бит равен нулю, значит это Raw Packet. Младшие биты дают 1, что означает 1+1=2 пикселя, то есть ff ff ff и 00 00 00. Дальше снова 01, то есть два сырых пикселя: 00 00 00 и ff ff ff.

В спеке написано, что «Run-length Packets should never encode pixels from more than one scan line», поэтому сырые пиксели разбиты на две группы.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Вот блин, вроде понял, спасибо большое. Завтра/сегодня закодирую декодировщик и проверю.

Младшие биты дают 1, что означает 1+1=2

Вот блин 1 это текущий блок + следующий, а 0 это просто текущий. Ещё раз спасибо. Читал позавчера сначала википедию, а потом перевод rfc-забыл-номер там было не так. Не то читал…

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

1 это текущий блок + следующий, а 0 это просто текущий

Какие запутанные формулировки. Какой такой текущий блок?

В заглавном сообщении ещё какие-то чередующиеся данные, нечередующиеся блоки. Вообще ничего не понятно.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Блоком я обзываю битность цвета, оно для RLE тут размер данных. Для RGBA это 4 байта, для R это 1 байт. Соответственно RLE упаковка для RGBA и R будет разной даже если сами данные картинок будут одинаковы

В заглавном сообщении ещё какие-то чередующиеся данные, нечередующиеся блоки.

Начитался не того и проецировал сорян. Ссылку потерял, браузер чистил и всё снёс.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

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

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

В спеке написано, что «Run-length Packets should never encode pixels from more than one scan line»,

Кстати в спеке 2.0. В 1.0 написано диаметрально противоположное :)

sailor
()
Ответ на: комментарий от sailor

Я уже написал, декодировщик, чужой код смотреть не хочу, хочется всё саму ^.^ Я даже подвал изображения выкидываю ибо мне это лишнее (разве что потом сделаю). Krita к слову тоже не умеет подвал делать. К тому же в некотором софте размер считается от конца файла, а там подвал 26 байт и получается жопка, без надобности и в целях совместимости со всем и вся вот это. Ах да, некоторый софт это и есть крита сейчас не проверял, но в 10 дебиане она падала если tga картинку после гимпа сунуть

00 00  . ..............
00000020: 00 00 00 00 00 00 54 52 55 45 56 49 53 49 4f 4e  ......TRUEVISION
00000030: 2d 58 46 49 4c 45 2e 00                          -XFILE..

удаляется и всё =) Хотя именно по наличию TRUEVISION-XFILE. в конце можно понять какая это версия спецификации, вроде как (на вики написано ыгг)

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.