Как прочитать размер большого растрового изображения

0

У меня проблемы с чтением больших растровых изображений. Обратите внимание, что это 24-битный BMP файл. Поэтому у меня есть изображение размером 800х600. В файле, где он указывает ширину и высоту, я получаю это.

Ширина (4 байта):

20 03 00 00

Высота (4 байта):

58 02 00 00

Я экспортировал оба с Paint.NET и MS Paint. Оба имеют одинаковый выход. Похоже, что когда изображения становятся большими, вычисления ошибочны. С небольшими изображениями (100x100 и так далее) результаты - это то, что я хочу. Я тестировал изменение размера вручную (width = 800;), и он отлично работает для того, что мне нужно. То, что я делаю, суммирует все байты и объединяется в целое число.

Пример: (Я храню файл в векторе, называемом хранилищем):

unsigned int width = store[0x12] + store[0x13] + store[0x14] + store[0x15];

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

ofstream s("hht.txt");
        s <<  width;
        s << "\n";
        s << dec << width;
        s << "\n";
        s << hex << width;
        s.close();

Это результат, который я получаю:

35
35
23

Итак, что я делаю неправильно?

ПРИМЕЧАНИЕ. Информация ширины -The находится в точке 0x12, а высота - 0x16. Файл -The - 800x600. -I не знают, как высота, но я знаю, что это неправильно.

  • 1
    Попробуйте store[0x12] + store[0x13] << 8 + store[0x14] << 16 + store[0x15] << 24 и посмотрите, как это происходит.
  • 0
    @PeterJ дает мне 0.
Показать ещё 15 комментариев
Теги:
hex
decimal
binary
bitmap

1 ответ

0
Лучший ответ

Есть пара ошибок в том, как вы вычисляете ширину.

unsigned int width = store[0x12] + store[0x13] + store[0x14] + store[0x15];

Что вы здесь делаете с вашим примером ширины:

unsigned int width = 0x20 + 0x03 + 0x00 + 0x00; // width = 0x23

Что это в десятичной форме:

unsigned int width = 32 + 3 + 0 + 0; // width = 35

Это не дает вам реального значения 20 03 00 00, потому что в этом случае 03 не должен представлять 0x03, он должен представлять 0x0300 (768 в десятичной системе).

Почему это работает с небольшими номерами? Ответ будет заключаться в том, что вы добавляете вместе одно число с тремя парами нулей в цифрах, которые обычно нужно умножать, чтобы получить их реальные значения. (Пример: ширина 32 будет равна 20 00 00 00, что добавит вместе 0x20 + 0x00 + 0x00 + 0x00, чтобы получить 0x20, что по-прежнему равно 32 десятичным)

Если вы еще не заметили, битмап содержит значения в порядке малозначности. Другими словами, значение ширины вместе не будет 0x20030000 (537067520 в десятичной форме), это будет 0x00000320 (800 в десятичной системе, ширина вашего растрового изображения).

width = *reinterpret_cast<uint32_t>(&store[0x12])

может работать в этом случае, но не только это может нарушить правила псевдонимов, это будет работать только на вашу реализацию, если uints тоже малозначительны. Если они большие, ваша ширина будет рассчитываться как 0x20030000 (537067520) вместо 0x00000320 (800).

  • 0
    Спасибо :) Это правильный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню