@Dogrtt
Qt/Python разработчик

Как из элемента QByteArray получить его бинарное представление?

Добрый день.
У меня есть QByteArray принятого через последовательный порт изображения. Каждый элемент QByteArray - это 1 пиксель (8бит), цвет от 0 до 255. Мне необходимо из этого, базового изображения сформировать 8 картинок. Алгоритм генерации такой:
Берем младший (нулевой, правый) бит первого пикселя исходного изображения, если он равен 0, то первый байт (пиксель) первого генерированного изображения должен быть черным ('00000000', '0x00', 0), если же младший бит первого пикселя исходного изображения равен 1, то первый байт(пиксель) первого генерированного изображения должен быть белым('11111111', '0xFF', 255). Также поступаем с первым битом первого пикселя исходного изображения, но формируем первый пиксель уже второго изображения, и так для первый пикселей всех оставшихся. Операцию повторяем для всех пикселей исходного изображения, тем самым формируя 8 двуцветных изображений.
С помощью Python 2.7, я алгоритм реализовал так:
def run(self):
        self.start_gen.emit(len(self.source_img))
        pb_val = 0
        for img in self.nine:
            self.nine[img] = bytearray(b'')
        for byte_ in self.source_img:
            pb_val += 1
            self.generating.emit(pb_val)
            bit_str = by2bi(byte_)
            for i in range(8):
                if bit_str[i] == '0':
                    self.nine['img_' + str(i)] += self.b0
                else:
                    self.nine['img_' + str(i)] += self.b255
        self.stop_gen.emit()

Но вот при переписывании всего этого дела на C++, возникли глупые проблемы из за отсутствия опыта.
Например, как мне привести элемент QByteArray к виду '00001111', чтобы в цикле проходиться по битам и сравнивать их с нулем или единицей? Как мне сформировать байты '0x00' и '0xFF', для записи в QByteArray каждой картинки?
Мне кажется, что надо все это дело побитовыми операциями решать, но как?
И еще, в Python, я просто беру и создаю словарь с массивами, для записи в них значений, как подобное сделать в C++? Я подумал, что следует формировать
QVector<QByteArray> generated_images;
Однако, компилятор ругается, что невозможно формировать вектор наполненный QByteArray'ями.
  • Вопрос задан
  • 611 просмотров
Пригласить эксперта
Ответы на вопрос 1
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Как-то так например
for(size_t y = 0; y < height; ++y) {
  for(size_t x = 0; x < width; ++x) {
    for(unsigned char i = 0; i < 8; ++i) {
      bool bit = (bytes[width * y + x] >> i) &1;
    }
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы