В растровом представлении изображения одно изображение обычно представляется блоком байтов (слов) в последовательности. Если вы используете упорядочение по строкам, вы также можете рассматривать его как двумерный массив и индексировать его как 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