Формат изображения и массивы без знака - PullRequest
2 голосов
/ 13 января 2010

Я разрабатываю функции обработки изображений (да, я ДЕЙСТВИТЕЛЬНО хочу изобрести колесо по разным причинам).

Я копирую растровые изображения в неподписанные массивы символов, но у меня возникли проблемы с размером байта в зависимости от формата пикселя изображения.

например, многие изображения представлены в виде 24 бит на пиксель для представления RGB, так что это довольно просто, каждый пиксель имеет 3 знака без знака (байты), и все довольны

однако иногда RGB имеет более странные типы, например, 48 бит на пиксель и 16 бит на цветовой канал. Копирование всего изображения в байтовый массив работает нормально, но когда я хочу получить данные, все становится размытым

Прямо сейчас у меня есть следующий код, чтобы получить один пиксель для изображений в градациях серого

unsigned char NImage::get_pixel(int i, int j)
   {
   return this->data[j * pitch + i];
   }

NImage :: data - массив без знака

Возвращает один байт. Как я могу получить доступ к массиву данных с различными форматами пикселей?

Ответы [ 4 ]

2 голосов
/ 13 января 2010

Вы должны сделать это так:

unsigned short NImage::get_pixel(int i, int j)
   {
       int offset = 2 * (j * pitch + i);
      // image pixels are usually stored in big-endian format
      return data[offset]*256 + data[offset+1];
   }
1 голос
/ 13 января 2010

Вы должны знать, насколько велики ваши пиксели.

Если это RGB, то ваше изображение размером 100x100 пикселей (скажем) будет иметь 30000 знаков без знака.

unsigned char NImage::get_red_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i)]; 
}

unsigned char NImage::get_green_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i) + 1]; 
}

unsigned char NImage::get_blue_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i) + 2]; 
}

или для 48-битного RGB,

unsigned char NImage::get_red_MSB(int i, int j) 
{ 
    return this->data[6*(j * pitch + i)]; 
}

unsigned char NImage::get_red_LSB(int i, int j) 
{ 
    return this->data[6*(j * pitch + i) + 1]; 
}

... etc etc ...
1 голос
/ 13 января 2010

При 48 битах на пиксель, при 16 битах на цвет, вы не можете вернуть 8-битное значение, вы должны вернуть 16-битную short или unsigned short, иначе данные будут усечены.

Вы можете попробовать разработать перегруженные функции, чтобы справиться с этим.

0 голосов
/ 13 января 2010

В чем проблема с 48 битами на пиксель? Просто прочитайте ваши данные как uint16_t или unsigned short, и вы получите 16 бит, извлеченный правильно.

Это ухудшается для более сложной битовой комбинации, т. Е. Rgb565, где вам нужно извлечь данные с помощью битовых масок.

...