Qimage в двумерный двоичный массив

Я работаю над механизмом, который позволит мне получить двумерный массив, заполненный двоичными данными на основе constBits() из QImage, созданного с флагом QImage::FormatMono.

Я ожидаю, что квадрат должен быть примерно таким:

1111
1001
1001
1111

но вместо этого я получаю это:

0001
0010
0100
1000

Я не совсем представляю, как работать с памятью побитно или как работать с MSB-сжатой строкой.

Вот код, который я использую для получения значения 1 пикселя и представления его в двоичном виде:

uint ConnectedChecker::pixel(const QImage& img, const int x, const int y) const
{
    const uchar mask = 0x80 >> (x % 8);
    return img.constBits()[x*y / 8] & mask ? 1 : 0;
}

И цикл, который я использую для заполнения массива:

int* _in;

for(uint i = 0; i < _rowCount; ++i) {
   for(uint j = 0; j < _columnCount; ++j) {
       *((_in + i*_columnCount) + j) = pixel(image, i, j);
   }
}

person MikSer    schedule 11.05.2020    source источник


Ответы (1)


Формула неверна, вам нужно что-то вроде

int a = y*img.bytesPerLine();
return (img.constBits()[a + x/8] >> (x & 7)) & 1;

Функция-член bytesPerLine() необходима для учета заполнения QImage, которое, возможно, добавляется в конце каждой строки сканирования.

Примечание: использование символа подчеркивания _ в начале идентификаторов — плохая идея (например, это может вызвать технические проблемы с глобальными идентификаторами или именами в верхнем регистре). Тоже чертовски некрасиво. Зачем ты это делаешь?

person 6502    schedule 11.05.2020
comment
Спасибо. Это глобальный идентификатор. Изначально объявлен в заголовке класса. Он используется для других операций в классе позже. - person MikSer; 11.05.2020
comment
@MikSer: глобальные идентификаторы - это случай, когда начальное подчеркивание запрещено и может вызвать тонкие проблемы. Если вам действительно очень нравится это уродливое подчеркивание, поместите его в конец имени, а не в начало (и никогда не используйте два из них рядом друг с другом, это также запрещено где-либо). - person 6502; 12.05.2020