Файл изображения в шестнадцатеричных данных (RGB888) в BMP, JPG, PNG или что-то еще - PullRequest
0 голосов
/ 11 декабря 2018

У меня возникла следующая проблема: я получил файлы изображений (предполагается, что это RGB888), но я не уверен, действительно ли это данные такого рода.(Я знаю только предполагаемый формат (например, 400 * 600) данных, поэтому я сделал пример данных изображения, где точно знаю, какой формат имеет шестнадцатеричные данные.)

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

0xf3, 0x8d, 0x4c, 0xff, 0xf2, 0x8f, 0x4b, 0xff, 0xef, ...

Я в этом случае уверен, что это RGB888, потому что я его конвертировал.Итак, первый шаг, который я сделал, - загрузить файл и передать данные в массив char.

std::ifstream infile;
char *array;
uint8_t *pixelValues;

infile.exceptions ( std::ifstream::failbit );
try {
  infile.open(filename, std::ios_base::binary); 
    infile >> std::hex >> std::setw(2) >> std::setfill('0');  
    int length;

    if (!infile.bad()) {
        length = infile.rdbuf()->pubseekoff(0, std::ios_base::end);
        array = new char[length];
        infile.rdbuf()->pubseekoff(0, std::ios_base::beg);
        infile.read(array, length);
        infile.close();
    }

    uint8_t value;
    pixelValues = new uint8_t[length/5];

    std::size_t counter = 0;
    std::size_t valueCounter = 0;

    while (true) {              
        value = strtol(&array[counter], NULL, 0);
        pixelValues[valueCounter++] = value;

        while ((array[counter] != ',')) counter++;  
        counter++;
        if (counter >= length) break;
    }
}

После этого шага данные в uint8_t pixelValues ​​должны быть Bitarray данных в файле.

Теперь у меня вопрос: как поступить ... правильно ли я все делаю или есть более «умные» способы получения изображения из этих шестнадцатеричных данных?

Моя коллега сказала мне, что я должен перейти к следующему шагу, используя openCV, но я не могу его запустить вообще.

Если у кого-нибудь из вас, ребята, есть умная идея, пожалуйста, дайте мне знать; -)

1 Ответ

0 голосов
/ 13 декабря 2018

Первое, что нужно проверить, когда кто-то дает вам необработанное изображение и говорит, что оно имеет размер 400x600 пикселей RGB888, это посмотреть на размер файла и посмотреть, равно ли оно:

400 * 600 * 3

байтов, которые вы можете проверитьочень легко, прежде чем они уйдут, оставив у вас ложное впечатление о формате и содержании.Итак, ваш файл точно 720 000 байт?


Если вы хотите самый простой способ получить PNG или JPEG, вы просто используете ImageMagick вкомандная строка в терминале / командной строке.Итак, если он имеет ширину 400 пикселей и высоту 600 пикселей и RGB888, вы должны сделать следующее, чтобы получить файл PNG:

magick -depth 8 -size 400x600 RGB:YourFile.dat result.png

Если вы хотите JPEG, используйте:

magick -depth 8 -size 400x600 RGB:YourFile.dat result.jpg

Если вы не хотите устанавливать ImageMagick , вы можете поместить заголовок NetPBM PPM в начало файла в терминале, например:

printf "P6\n400 600\n255\n"  >  result.ppm
cat YourImage.dat            >> result.ppm

Тогда у вас будет файл, который Photoshop , GIMP , feh и многие другие программы могут читать и сохранять как PNG или JPG.Конечно, вы можете сделать то же самое в 3 строчках C ++.


Если вам не нравится ни одно, вы можете использовать CImg - блестящий, маленький, легкийиспользовать C ++ библиотеку обработки изображений.См. здесь для примера.

...