почему unsigned char для данных пикселей RGB? - PullRequest
5 голосов
/ 21 апреля 2011

Я подхожу к c ++ с некоторой базовой компьютерной графикой.

данные пикселей обычно представлены в виде:

unsigned char *pixels

, и неподписанный символ хорош, потому что это значение между 0 и 255(256 = 2 ^ 8, потому что символ - это 2 байта, а 1 байт - 8 бит?).и это хорошо, потому что в цвете RGB представлены числа от 0 до 255.

, но .. я понимаю это как монохромное изображение, в нормальном изображении у меня есть RGB, у меня будет 3 массива неотображенныхсимвол, один для красного, один для зеленого, один для синего.что-то вроде:

unsigned char *pixels[3]

но я никогда не находил что-то похожее для данных пикселей RGB

Ответы [ 4 ]

9 голосов
/ 21 апреля 2011

RGB-изображения обычно хранятся в чередующемся порядке (R1, G1, B1, R2, G2, B2, ...), поэтому достаточно одного указателя (на R1).

Это делает его немноготруднее обращаться к отдельным пикселям: пиксель с индексом N хранится в pixels[3*N+0], pixels[3*N+1] и pixels[3*N+2] вместо просто red[N], green[N], blue[N].

Однако это имеет преимущество, заключающееся в обеспечении более быстрого доступа: меньше указателейвести к более легким программам, улучшая их скорость;чередующийся порядок также делает кэширование памяти более эффективным.

4 голосов
/ 21 апреля 2011
unsigned char *pixels[3];

объявляет массив из трех указателей на unsigned char. Я не уверен, что ты этого хотел.

Существует несколько различных способов представления пикселей. Самое простое, вероятно, что-то вроде:

struct Pixel
{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

Но вы, возможно, должны (или хотите) соответствовать какому-либо внешнему формату. Другая частая возможность - поместить все три цвета в uint32_t. Кроме того, в некоторых графических системах может присутствовать четвертый элемент и альфа, представляющий прозрачность.

3 голосов
/ 21 апреля 2011

Действительно, когда вы ссылаетесь на блок байтов, он будет иметь тип unsigned char* из-за того факта, что unsigned char по спецификации C не имеет заполнения в самом типе (т. Е. Каждый бит используется длязначение в байте, и нет заполненных битов, которые не используются), и данные пикселей будут представлять собой некоторый блок из байтов X без дополнения (по крайней мере, без внутреннего дополнения ... может быть заполнение в концебуфера для выравнивания).Это также, скорее всего, будет где-то размещено в куче.Поэтому независимо от того, будет ли он монохромным, с цветными данными и т. Д., Вы часто обнаружите, что на пиксельный буфер будет указывать указатель unsigned char, и вы можете затем привести его к некоторому struct, как упоминал Джеймсдля того, чтобы легко получить доступ к информации о пикселях.В других случаях вам может понадобиться индексировать в буфер, как упоминает анатолиг.Но, в конце концов, буфер пикселей - это просто буфер данных, и к общему буферу байтов данных следует обращаться в C / C ++, используя тип unsigned char*.

3 голосов
/ 21 апреля 2011

С * пикселями [3] у вас есть отдельные массивы для трех цветовых компонентов, тогда как в файлах три цветовых компонента для одного пикселя хранятся вместе.Это также означает, что вы можете использовать одну функцию fread () / fwrite () для всего блока данных изображения,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...