|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||||||
Нарезка байтового массива на битовые части07.01.2021, 04:15. Показов 3445. Ответов 5
Метки нет (Все метки)
Доброй ночи, уважаемые форумчане, всех с наступившим новым годом.
Немного информации, которая связана с вопросом: 1.Имеется сырой буфер изображения, который, предположительно, может иметь размер, который не вмещается в границу байта или, наоборот, до неё не дотягивает, цветовых компонет пикселей. Также важным является то, что место в данном буфере тоже экономится, поэтому данные лежат подряд, и, поэтому, важно учесть, что если первая компонента цвета будет иметь размер 5 бит, то следующие 3 бита, будут приходиться на другую компоненту цвета пикселя. 2.Вектор с информацией о количестве бит в каждой цветовой компоненте - тут всё достаточно просто, тут может быть одно значение(двуцветное изображение) или 3, или даже 6 (какая-нибудь экзотика). Сами значения представляют количество бит в каждой цветовой компоненте. 3. Порядок бит, идентификатор/флаг, который информирует о порядке бит (справа-налево/наоборот) 4. Дабы немного прояснить для чего это нужно, сделаю небольшую вставку из спецификации формата TIFF 6.0: Кликните здесь для просмотра всего текста
FillOrder The logical order of bits within a byte. Tag = 266 (10A.H) Type = SHORT N = 1 1 = pixels are arranged within a byte such that pixels with lower column values are stored in the higher-order bits of the byte. 1-bit uncompressed data example: Pixel 0 of a row is stored in the high-order bit of byte 0, pixel 1 is stored in the next-highest bit, ..., pixel 7 is stored in the low-order bit of byte 0, pixel 8 is stored in the high-order bit of byte 1, and so on. CCITT 1-bit compressed data example: The high-order bit of the first compression code is stored in the high-order bit of byte 0, the next-highest bit of the first compression code is stored in the next-highest bit of byte 0, and so on. 2 = pixels are arranged within a byte such that pixels with lower column values are stored in the lower-order bits of the byte. We recommend that FillOrder=2 be used only in special-purpose applications. It is easy and inexpensive for writers to reverse bit order by using a 256-byte lookup table. FillOrder = 2 should be used only when BitsPerSample = 1 and the data is either uncompressed or compressed using CCITT 1D or 2D compression, to avoid potentially ambigous situations. Support for FillOrder=2 is not required in a Baseline TIFF compliant reader. Default is FillOrder = 1. Если опустить лишнее, то получается примерно так: Кликните здесь для просмотра всего текста
пример для однобитных изображений
пиксели: Fill Order = 1- *0 1 2 3 4 5 6 7 Fill Order = 2- *7 6 5 4 3 2 1 0 +---------------+ |1|0|1|0|1|0|1|0| +---------------+ пример для произвольно битных изображений [5 6 5] bit (предположительно 2 варианта (Fill Order = 2), спецификация явно об этом не говорит) вариант 1: Fill Order = 1- |----R----|------G-----|----B----| Fill Order = 2- |----R----|------G-----|----B----| - только биты наоборот Fill Order = 2- |--G--|----R----||----B----|--G--| +---------------++---------------+ |1|0|1|0|1|0|1|0||1|0|1|0|1|0|1|0| +---------------++---------------+ 0 байт________1 байт Есть потребность в алгоритме, который бы принимал: массив байт, размер массива, вектор с информацией о количестве и значении битовых компонент, а также порядок бит, и нарезал поступивший массив на битовые отрезки произвольной длины и компановал это в новый буфер (массив/вектор не важно) типа данных unsigned char, где внутри каждая отдельная переменная содержала бы в себе компоненту с определенным количеством бит. Был бы признателен любой помощи, т.к. не слишком сильно дружу с битовыми операциями и битовыми масками. Написал только это, да и то, одно расстройство:
0
|
||||||
| 07.01.2021, 04:15 | |
|
Ответы с готовыми решениями:
5
Неверное отображение байтового массива
Создание файла из байтового массива |
|
Мозгоправ
|
||||||
| 08.01.2021, 04:38 | ||||||
Сообщение было отмечено Aringot как решение
Решение
Aringot, у вас как-то всё сложно получилось... Да и контекст тяжеловат для понимания. Я вам накидал эскиз класса, который реализует битовый поток.
Вы можете изменить класс под ваши потребности относительно источника данных. У меня это istream. Чтение байта из потока производится в одном месте. Можете поставить туда свою функцию, которая извлекает очередной байт из вашего массива/вектора. В main() небольшая проверка работы класса. С пристрастием код не тестировал, но вроде работает.
1
|
||||||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||||||
| 08.01.2021, 13:58 [ТС] | |||||||||||||||||||||
|
Доброе утро, выражаю большую благодарность за достаточно информативный пример класса.
Следуя Вашим советам накидал вот это:
и, предположительно необходимо сделать следующее:
Немогли бы Вы просмотреть своим наметаным глазом на эту проблему, возможно ошибаюсь я, а может и действительно, произошла опечатка. Спасибо.
0
|
|||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 08.01.2021, 14:05 [ТС] | |
|
Вот сделал наглядный скриншот с двумя вариантами, первый - там моей правки нет, второй - есть.
0
|
|
|
Мозгоправ
|
||||||||||||||||||||||
| 08.01.2021, 18:09 | ||||||||||||||||||||||
|
Aringot, во-первых, вы опять всё усложнили. Сложную задачу надо разбивать на последовательность простых решений. А вы взяли простое решение подзадачи и начали его "дорабатывать" до полного решения. И получили монстра. Почитайте про SOLID.
Во-вторых, или я неправильно понял постановку задачи, или ваш вариант работает неправильно в принципе. Если изменить в вашем варианте main() таким образом:
{ 170, 210, 255 } в двоичном представлении, во второй строке - та же последовательность битов, но разделённая на группы по 5 штук. Последние четыре бита 1111 отбрасываются, поскольку не образуют полную группу из 5 битов.Ваша программа выдаёт:
Как всё-таки должно работать разбиение на группы битов? Как реализовал я или как вы? Добавлено через 1 час 6 минут Aringot, когда я написал
Если вам надо работать с несколькими источниками байтовых данных (я вижу у вас VECTOR, PTRARRAY), то сделайте абстрактный базовый класс, описывающий интерфейс, и унаследуйте от него классы, которые реализуют абстрактные методы для различных источников данных. В этом случае BitStream будет обращаться как бы к методам абстрактного класса, но при создании объекта вы будете указывать объект класса-наследника, имеющий нужную реализацию методов.
0
|
||||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||
| 08.01.2021, 23:54 [ТС] | |||||||||||
|
Приношу извинения за дезенформацию, Ваше решение верное, это я некорректно сделал свой вариант, в данный момент сел и нашёл косяк, он был в этом:
Таким образом, проблема решена. Вот код, может пригодится кому-нибудь:
Большое спасибо!
0
|
|||||||||||
| 08.01.2021, 23:54 | |
|
Помогаю со студенческими работами здесь
6
Перевод байтового массива в другую кодировку Преобразование динамического байтового массива в SafeArray Создание байтового массива с помощью MemCopy, RtlMoveMemory
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|