Суть вот две картинки из 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 кому надо