Значения C RGB из пикселя, выбранного пользователем, с помощью seekg

#c #rgb #seekg

#c #rgb #seekg

Вопрос:

Мне нужно создать программу, которая загружает изображение .raw (общее изображение 100×100), просит пользователя выбрать координату (x, y) в пределах диапазона и отобразить значения красного, зеленого и синего для указанного пикселя с помощью функции seekg. Я в недоумении относительно того, как получить значения rgb из пикселя. Я просмотрел все главы учебника, которые мы рассмотрели до сих пор, и там ничего не говорится о восстановлении значений rgb.

Код, запрашивающий координаты и выдающий сообщение об ошибке, если он находится за пределами диапазона, работает нормально. Только когда я пытаюсь придумать код для использования seekg / получения значений rgb, у меня возникают проблемы. Я просмотрел разные вопросы на сайте, и здесь есть хорошая информация, но я не вижу никаких ответов с использованием seekg для получения значений rgb.

Я не ищу никого, кто мог бы создать код для меня, просто ищу некоторые рекомендации и толчок в правильном направлении.

 loc = (y * 100   x) * 3;  // code given by professor with 100 being the width of the image
imageRaw.seekg(loc, ios::beg);
  

И тогда я в растерянности.

Любая помощь будет принята с благодарностью.

Комментарии:

1. Кажется, что после выполнения seekg() указатель чтения файла помещается в первый байт из 3, которые, будучи взятыми вместе, дают цвет пикселя. Что вы можете сделать дальше?

2. Вот где я заблудился. В данный момент я чувствую себя очень глупо. Это не сложное задание, я это знаю, но что-то у меня не получается.

Ответ №1:

Оттуда вам, вероятно, потребуется прочитать три байта, которые будут представлять значения красного, зеленого и синего. Вы не сказали нам достаточно, чтобы быть уверенными в порядке; зеленый почти всегда посередине, но RGB и BGR оба довольно распространены.

С практической точки зрения, для изображения такого размера вы обычно вообще не хотите использовать seekg. Вы бы прочитали все изображение в память и выполнили поиск значений в векторе (или массиве, если вы настаиваете), в котором хранятся данные.

Комментарии:

1. Я хотел бы подробнее остановиться на этом ответе, сказав, что вам нужно продвигаться вперед, какова бы ни была ваша битовая глубина вашего изображения. Ваше предварительное значение может быть не байтовым (8-битный цвет) изображения могут варьироваться от 2 бит до 32 битного цвета, поэтому вам также необходимо это учитывать.

2. … Я думаю, если вы собираетесь проверять только один пиксель, нет смысла переносить изображение в память. Но если бы вы собирались выполнять какую-либо реальную работу с изображением, вы бы перенесли его в память (в вектор / массив или, возможно, через mmap , если вы используете Unix)

3. @Shadow: это 3 байта / пиксель, как вы можете видеть из формулы в вопросе. Обратите внимание на * 3 в нем. Но то, что вы говорите, в целом верно, конечно. (И я полагаю, что здесь может быть правдой, ничто не говорит о том, что 24 бита должны распределяться равномерно между тремя каналами. Или что они даже должны быть значениями RGB, YUV, HSV и т.д. тоже возможно. Но это был бы злой профессор.)

4. @derobert Я согласен, я рад, что проблема не сложнее, чем должна быть. Это типично для реальной жизненной ситуации.