Опис формату tga

Опис формату даних, що зберігаються

Зауважте, що тут ми використовуємо саме беззнакову змінну - це важливо, тому що значення, що зберігається в BlockInfo може бути більше ніж 128 - максимальне значення для змінної типу CHAR.

Для того, щоб дізнатися що за інформація лежить тут, вам потрібно перевірити стан першого біта в змінної BlockInfo

Чому саме 128? Подивимося на її двійкового коду

Як бачите, на початку варто одиниця, а при операції «І» будь-нуль перекриває одиницю, а одиниця з одиницею дасть одиницю,
так що якщо стан BlockInfo було приміром

Те після операції І в змінно WhatItIs буде ось що

Тобто, видно, що ми отримаємо стан першого біта

А якщо BlockInfo дорівнювало

Те після операції І в змінної WhatItIs було б

Тобто, в першому бите вже не 1 а 0 :))

Так ось, продовжимо.

Після того, як перевіримо що за стан у нас має перший біт, ми зможемо дізнатися інформацію про те, які дані нам дано:
Якщо стан першого біта одно едініце- то це запаковані дані
Якщо стан першого біта дорівнює нулю - то це незапакованние дані
ПРИКЛАД:

У першому блоці дужок запаковані дані, у другому блоці дужок незапакованние.

Поки ми розібралися лише з першим бітом, а в одній байте їх 8, але тому що один вже використаний, то нам залишаються тільки 7. Що ж з ними робити? І для чого вони потрібні і як дізнатися їх стан всіх відразу?

У решти 7 бітах зберігається кількість пікселів-1 які йдуть після читання нашої однобайтового змінної. Далі все поясню.

Для того щоб дізнатися яке число зберігається в цих 7 бітах ми виконаємо все те, що робили на початку, тільки замість

У десятковій системі це число дорівнює 127-ми. Таким чином, щоб дізнатися кількість пікселів, потрібно зробити наступні дії:
NumPixels = BlockInfo 127

Тепер ми знаємо як зберігаються наші дані і скільки їх потрібно обробити, подивимося що вийшло:

Отже, почнемо обговорювати запакували дані і НЕ запаковані.

Після того першого байта йде інформація про єдино пікселі і тут потрібно знати скільки біт йде на піксель
Якщо у нас на піксель йде 24 біта, то нам потрібно прочитати 3 байта (24/8 = 3), а якщо 32 біта то 4 байта
Після того, як ми прочитаємо ці 24 або 32 біта потрібно просто-напросто вкласти в наш масив пікселів стільки однакових пікселів, скільки їх записано в змінної NumPixels

Ви можете запитати, чому ми додали одиницю до змінної - це зроблено тому, що при вилученні кількості пікселів, значення яке ми отримаємо завжди менше на одиницю, це зроблено через те, що у нас залишилося тільки 7 біт, було б 8 ми б нічого не додавали.

2. Незапакованние дані

При незапакованних даних інформація зберігається про кожному пікселі послідовно, тобто, якщо у змінній NumPixels було б значення 20, то нам потрібно було б прочитати 20 пікселів. Тобто, просто читаєте інформацію про пікселі і все.

Як бачите все дуже легко і просто.

ОСЬ ПОВНИЙ ПРИКЛАД:

Схожі статті