Почему пиксели изображения должны быть разложены в блоке WORD в памяти?

Сейчас я читаю исходный код leptonica, отличного инструмента для обработки и анализа изображений документов. библиотека. В этой библиотеке она содержит базовую структуру изображения Pix, которая используется для представления изображения. В этой структуре у него есть переменная для определения того, сколько СЛОВ (одно СЛОВО равно 4 байтам) мы должны сохранить для пикселей в каждой горизонтальной строке изображения, и определение выглядит следующим образом:

 wpl = (width * depth + 31) / 32;

где depth указывает, сколько бит содержит пиксель. Например, для изображения в градациях серого глубина его пикселя равна 8, а для цветного изображения глубина пикселя равна 24.

Тогда память, которая должна быть выделена под пиксели изображения, становится:

4 * wpl * height; 

Лично я не могу понять, почему пиксели должны быть тайлированы в памяти таким образом. Есть идеи?


person feelfree    schedule 13.01.2016    source источник


Ответы (1)


В растровом представлении изображения одно изображение обычно представляется блоком байтов (слов) в последовательности. Если вы используете упорядочение по строкам, вы также можете рассматривать его как двумерный массив и индексировать его как arr[row][col], если вы приводите его к соответствующему типу массива (например, в коде C).

Если depth — это количество битов для одного пикселя, width * depth — это количество битов для всей строки.

Тогда (width * depth + 31) / 32 в целочисленной арифметике — это наименьшее количество 32-битных блоков, необходимых для хранения этой строки.

(Обратите внимание, что +31 используется для обеспечения округления в большую сторону в случае, если width * depth не является кратным. Обычно x / n будет округляться в меньшую сторону как в C, так и в C++, отбрасывая остаток. Но если мы добавим n - 1 перед округлением, как в выражении (x + (n-1)) / n, мы гарантируем, что если в x / n есть ненулевой остаток, то он суммируется с n-1 еще на единицу, кратную n, а затем любой остаток после этого отбрасывается. Так что это способ округления вверх, а не вниз в ( без знака) целочисленная арифметика.)

Тогда количество 32-битных блоков, необходимых для всего изображения, равно wpl * height. Если мы умножим на 4, то получим, что 4 * wpl * height — это количество 8-битных блоков (байтов), необходимых для всего изображения.

Обратите внимание, что если глубина в битах намного меньше 32, например, если глубина равна 8, как вы сказали, это на самом деле будет довольно неэффективно, поскольку вы все равно получите 32 бита на пиксель, даже если вам нужно только используйте 8 из них. Однако наиболее распространенным форматом растровых изображений является 32-битный RGBA, поэтому в типичных случаях / для типичных форматы, не было бы столько отходов.

person Chris Beck    schedule 13.01.2016
comment
+1. Чтобы ответить на часть вопроса «почему»: требование 4-байтового выравнивания может ускорить доступ к памяти, возможно, разрешить использование некоторых кодов операций векторизации и предоставить пару битов в указателях строки сканирования для грязных трюков реализации. - person Adrian McCarthy; 13.01.2016