Формат файла bmp c
BMP (BitMaP) - основной метод хранения несжатых графических файлов. Фотография с 6-ти мегапискельного фотоаппарата в этом формате будет иметь размер 18М байт.
В начале 2000-х годов Microsoft пыталась сделать BMP-файлы основным видом графических файлов. В связи с этим была добавлена возможность хранения в этих файлах графических файлов других графических форматов (включая png, jpeg и др.). Но сейчас от этой идеи отказались и BMP-файлы используются лишь для хранения несжатых изображений.
Помимо базового варианта (3 байта на точку, BMP-24) может быть "серый" файл (1 байт на точку) и некоторые другие. Далее мы будем рассматриать только файлы формата BMP-24.
Строчки в bmp-файле хранятся в обратном порядке, то есть в начале идет самая нижняя строка изображения. Внутри строки байты имеют порядок BGR BGR . Кроме того, длина каждой строки выровнена до кратного четырех. То есть для изображения шириной 3 точки длина строки равна 12 байт (3 точки по 3 байта, всего 9 байт, затем увеличиваем длину строки до кратного 4).
В начале bmp-файла идет заголовок следующей структуры: Отметим, что в этом примере кода тип int предполагается 32-битовым. Если в вашем случае это не так, то вместо int надо использовать тип 4-х байтового целого числа. Аналогично, __int16 означает 16-битовое целое число. Если ваш компилятор такого идентификатора не знает, то его надо заменить на соответствующий.
Чтение файла формата BMP-24 можно осуществить следующей функцией. В переменных mx,my возвращаются размеры файла. Для графических данных функция выделяет память (new int[mx*my]). Именно этот указатель и возвращатся в качестве результата. Он указывает на одномерный массив целых чисел, в котором лежат последовательно цветовые значения всех пикселей изображения. В каждое целое 4-х байтовое число упаковано по 3 байта RGB в формате R + 256*G + 65536*B. В случае какой-либо ошибки память не выделяется, возвращается NULL.
ВНИМАНИЕ!. Освобождать память должна будет программа, вызвавшая данную функцию, например: Для записи в BMP-файл можно использовать фунцию
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инкапсулирует точечный рисунок GDI+, состоящий из данных пикселей графического изображения и атрибутов рисунка. Объект Bitmap используется для работы с изображениями, определяемыми данными пикселей.
Примеры
В следующем примере кода показано, как создать новый объект Bitmap из файла с помощью GetPixel SetPixel методов и для перекрашивания изображения. В нем также используются PixelFormat Width свойства, и Height .
Этот пример предназначен для использования с Windows Forms, который содержит, и, Label PictureBox Button Label1 PictureBox1 и Button1 соответственно. Вставьте код в форму и свяжите Button1_Click метод с Click событием кнопки.
Комментарии
Точечный рисунок состоит из точечных данных для графического изображения и его атрибутов. Существует множество стандартных форматов для сохранения растрового изображения в файл. GDI+ поддерживает следующие форматы файлов: BMP, GIF, EXIF, JPG, PNG и TIFF. Дополнительные сведения о поддерживаемых форматах см. в разделе Типы точечных рисунков.
BitmapКласс недоступен для разных доменов приложений. Например, если создать динамическую AppDomain и создать несколько кистей, перьев и точечных рисунков в этом домене, а затем передать эти объекты обратно в основной домен приложения, вы можете успешно использовать перья и кисти. Однако при вызове DrawImage метода для рисования упакованного Bitmap можно получить следующее исключение.
Удаленное взаимодействие не может найти поле "Native Image" в типе "System. Drawing. Image".
Конструкторы
Инициализирует новый экземпляр класса Bitmap из указанного существующего изображения.
Инициализирует новый экземпляр класса Bitmap из указанного существующего изображения, масштабированного до заданного размера.
Инициализирует новый экземпляр класса Bitmap из указанного существующего изображения, масштабированного до заданного размера.
Инициализирует новый экземпляр класса Bitmap с заданным размером.
Инициализирует новый экземпляр класса Bitmap с заданным размером и с разрешением указанного объекта Graphics.
Инициализирует новый экземпляр класса Bitmap с заданным размером, форматом и данными пикселей.
Инициализирует новый экземпляр класса Bitmap с заданными значениями размера и формата.
Инициализирует новый экземпляр класса Bitmap из указанного потока данных.
Инициализирует новый экземпляр класса Bitmap из указанного потока данных.
Инициализирует новый экземпляр класса Bitmap из указанного файла.
Инициализирует новый экземпляр класса Bitmap из указанного файла.
Инициализирует новый экземпляр класса Bitmap из указанного ресурса.
Свойства
Возвращает флаги атрибутов для пиксельных данных этого объекта Image.
Возвращает массив идентификаторов GUID, представляющих размеры кадров в объекте Image.
Возвращает высоту объекта Image в пикселях.
Возвращает горизонтальное разрешение объекта Image в пикселях на дюйм.
Возвращает или задает палитру цветов, используемую для объекта Image.
Возвращает ширину и высоту данного изображения.
Возвращает формат пикселей для этого объекта Image.
Возвращает идентификаторы элементов свойств, хранящихся в объекте Image.
Возвращает все элементы свойств (части метаданных), хранящихся в объекте Image.
Возвращает формат файла этого объекта Image.
Возвращает ширину и высоту изображения в пикселях.
Возвращает или задает объект, предоставляющий дополнительные данные об изображении.
Возвращает вертикальное разрешение объекта Image в пикселях на дюйм.
Возвращает ширину объекта Image в пикселях.
Методы
Создает точную копию данного объекта Image.
Создает копию раздела этого объекта Bitmap, определяемого структурой Rectangle и с указанным перечислением PixelFormat.
Создает копию части этого изображения Bitmap, определяемого заданным перечислением PixelFormat.
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.
Освобождает все ресурсы, используемые этим объектом Image.
Освобождает неуправляемые ресурсы, используемые объектом Image, а при необходимости освобождает также управляемые ресурсы.
Определяет, равен ли указанный объект текущему объекту.
Создает изображение Bitmap для значка из дескриптора Windows.
Создает изображение Bitmap из указанного ресурса Windows.
Возвращает границы изображения в указанных единицах измерения.
Возвращает информацию о параметрах, поддерживаемых указанным кодировщиком изображения.
Возвращает количество кадров указанного размера.
Служит хэш-функцией по умолчанию.
Создает растровый объект GDI из этого объекта Bitmap .
Создает растровый объект GDI из этого объекта Bitmap .
Возвращает дескриптор для значка.
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.
Возвращает цвет указанного пикселя в этом изображении Bitmap.
Возвращает указанный элемент свойства из объекта Image.
Возвращает эскиз для этого объекта Image.
Возвращает объект Type для текущего экземпляра.
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.
Блокирует объект Bitmap в системной памяти.
Блокирует объект Bitmap в системной памяти.
Делает прозрачным прозрачный цвет по умолчанию для этого элемента Bitmap.
Делает заданный цвет прозрачным для данного изображения Bitmap.
Создает неполную копию текущего объекта Object.
Создает неполную копию текущего объекта MarshalByRefObject.
Удаляет указанный элемент свойства из этого Image.
Поворачивает, зеркально отражает, либо поворачивает и зеркально отражает объект Image.
Сохраняет данное изображение в указанный поток с заданным кодировщиком и определенными параметрами кодировщика изображения.
Сохраняет данное изображение в указанный поток в указанном формате.
Сохраняет объект Image в указанный файл или поток.
Сохраняет объект Image в указанный файл с заданным кодировщиком и определенными параметрами кодировщика изображения.
Сохраняет объект Image в указанный файл в указанном формате.
Добавляет кадр в файл или поток, указанный в предыдущем вызове метода Save. Используйте данный метод для сохранения выбранных кадров из многокадрового изображения в другое многокадровое изображение.
Добавляет кадр в файл или поток, указанный в предыдущем вызове метода Save.
Выделяет кадр, определяемый размером и индексом.
Задает цвет указанного пикселя в этом объекте Bitmap.
Сохраняет элемент свойства (часть метаданных) в Image.
Задает разрешение для этого изображения Bitmap.
Возвращает строку, представляющую текущий объект.
Разблокирует это изображение Bitmap из оперативной памяти.
Явные реализации интерфейса
Заполняет объект SerializationInfo данными, необходимыми для сериализации целевого объекта.
Создайте в графическом редакторе PAINT растровое изображение размером 50*35 пикселов. Выберите максимальный масштаб изображения и включите сетку. Сохраните рисунок в формате BMP как монохромный (файл 50_35.bmp).
Откройте листинг файла 50_35.bmp в приложении Commander (TC, VC или WC) для просмотра (клавиша F3) в шестнадцатеричном (HEX) представлении.
Сопоставим картинку растрового изображения и HEX коды в листинге файла 50_35.bmp.
Коды с 19-го по 23-й (32 00 00 00) определяют размер растра (число пикселов) по горизонтали. Коды с 24-го по 27-й (23 00 00 00) определяют размер растра по вертикали. Чтобы убедиться в этом воспользуйтесь калькулятором. В рассматриваемом примере размер растра – 50 * 35. HEX коду 32 соответствует десятичное (DEC) число 50, HEX коду 23 – DEC число 35.
На размера растра отводится 4 байта (HEX кода). Одним байтом определяется размер от 0 до 255. При превышении 255 (код FF) будет задействован следующий байт. Например, DEC числу 256 соответствует HEX код 100. Размер растра 256 будет представлен в листинге файла (00 01 00 00).
Коды символов, начиная с 63-го и до конца файла, содержат последовательность данных о цвете точек растра – в порядке слева направо вдоль каждой ряда и снизу вверх по рядам. Один байт описывает 8 точек, белая точка в BIN коде описывается единицей, черная – нулем.
Сколько байт необходимо для описания 50 точек в одном ряду? Не менее 7 (7*8=56). Но используется 8 (8*8=64), соблюдается кратность 4 байтам (4*8=32). Обратите внимание в листинге файла на HEX коды в конце описания каждого ряда повторяются байты FF FF C0 00. Эти байты описывают последние 32 точки из 64-х. Из них 14 несуществующих точек (64-50=14) описаны нулями.
Точки какого ряда описаны кодом FC 1F? Отсчитываем ряды по (по 8 байт в каждом), можно также ориентироваться на код (C0 00) в конце каждого ряда. Получаем 11-й ряд. В нем находятся 5 точек. Проверяем результат с помощью калькулятора.
Программа последовательно считывает из BMP-файла HEX-коды. По этим данным определяется порядковый номер каждой черной точки в ряду, начиная слева. Порядковые номера черных точек каждого ряда заносятся в список, который после окончании чтения ряда записывается в файл Result.txt.
Информация, записанная в файл Result.txt:
Описание программы
Из BMP-файла последовательно считываются байты с помощью функции read-char. Данные, которые будут использоваться в программе, запоминаются в переменных, остальные пропускаются.
Размер растра (xsize и ysize) определяется парой из 4-х байт. Как объединить эти 4 байта в одно число? Рассмотрим более простую задачу. Как из 4-х цифр «5» «8» «9» и «1» сформировать число 1985? Для этого каждую цифру сдвигаем влево на соответствующее количество разрядов (добавляем нули слева), а результат суммируем.
Аналогично решается задача формирования 4-х байтного числа. В пользовательской функции (r) из 4-х байтов сложением формируется одно число. Каждый байт перед сложением сдвигается на соответствующее количество разрядов (1, 2 и 3 байта). Сдвиг выполняется функцией Lsh, параметры сдвига указывается в битах (8, 16 и 24). Функция (r) возвращает число в 10-тичном представлении. Результат запоминается в переменных (xsize и ysize).
Далее считываются и обрабатываются точки, на предмет выявления их цвета. Используется внешний цикл по ysize и внутренний цикл по xsize.
Учитывая, что число байтов, которые описывают один ряд точек, кратно 4 объединим их по аналогии с предыдущей задачей. Только в этом случае из 4-х цифр «5» «8» «9» и «1» будем формировать число 5891:
Отметим, что любое число независимо от его представления (HEX, DEC, BIN) остается одним и тем же. А функции обрабатывают его по-разному. Например, функция read-char работает с байтами, а Lsh с битами.
После тестирования первого пиксела, единица в маске сдвигается вправо (lsh mask -1):
Тестирование каждой точки, которая описывается в переменной n, анализируется путем применения побитового умножения c значением переменной mask(if (= (logand n mask) 0) (setq lst (cons x lst))):
В верхнем примере проверялась крайняя 6-я точка сформированного числа, в нижнем примере – 19-я точка. Если результат побитового умножения ноль, то проверяемая точка – черная. Порядковый номер точки в ряду сохраняется в переменой x. Каждая черная точка заносится в начало списка (setq lst (cons x lst)). По окончании анализа ряда список записывается наоборот в файле результата result.txt (princ (reverse lst) fo).
На рисунке приведен пример простого изображения (размер 34 *10 точек) из 3-х красных точек в левом нижнем углу, остальные точки белые.
Раскрываем листинг файла и, сопоставляя с изображением, определяем, как описываются данные в нем:
Файл начинается с символов “BM”, указывающих на формат файла.
С 19 позиции 4 байта (22 00 00 00) указывают размер файла по X (количество точек в строке 34), с 23-й позиции – 4 байта (0A 00 00 00) указывают размер файла по Y (количество рядов 10).
Начиная с 55-го байта и до конца файла содержатся данные о цвете точек растра – в порядке слева направо вдоль каждого ряда и снизу вверх по рядам. Одна точка описывается тремя байтами, каждый из которых представляет синюю (Blue), зеленую (Green) и красную (Red) составляющие цвета. В рассматриваемом примере первая точка (красного цвета) описана байтами (00 00 FF) вторая (белого цвета) – (FF FF FF).
Каждый ряд точек описывается количеством байт, кратным 4. Ряд из 34 точек должен описываться 34*3 + 2 =104 байтами. Два байта (00 00) добавляется в конце описания каждого ряда для обеспечения кратности 4. Если бы ряд состоял из 33 точек, то в конце каждого ряда добавилось по 1 байту для обеспечения кратности 4 (33*3 + 1 =100).
Ниже приводится модуль программы, который используется в приложении для идентификации продуктов (фруктов и овощей) на основе данных от видеокамеры. Модуль обеспечивает загрузку картинки и считывания точек (по 3 байта на каждую точку) из файла.
Ниже приводится модуль программы, который используется в приложении 3D-реконструкция по 2-м изображениям. Модуль обеспечивает загрузку данных из BMP файлов в динамически выделяемую оперативную память.
За информационным заголовком следует таблица цветов, представляющая собой массив из 256 (по числу цветов) 4-байтовых полей. Каждое поле соответствует своему цвету в палитре, а три байта из четырех – компонентам синей, зеленой и красной составляющих для этого цвета. Последний, самый старший байт каждого поля зарезервирован и равен 0.
После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Так как на некоторых платформах невозможно считать единицу данных, которая меньше 4 байт, длина каждой строки выровнена на границу в 4 байта, т. е. при длине строки, некратной четырем, она дополняется нулями. Это обстоятельство обязательно надо учитывать при считывании файла.
На нижнем рисунке представлено точечное изображение (10*5) и конец листинга файла, где захвачены несколько полей из таблицы цветов и приводятся данные об изображении (обведены красной линией).
На рисунке выделены по 4 байта цветов палитры, которые используются для указания цвета точек. Белый цвет имеет последний номер в таблице цветов – 255 (FF). Синий цвет указан под номером 252 (FC), зеленый – 250 (FA), красный – 249 (F9). Длина каждой строки дополняется 2-я байтами (00 00) для кратности 4 (10+2=12).
Проще говоря, растровое изображение - это изображение, состоящее из одного пикселя. Распространенными форматами изображений являются jpg (jpeg), png и bmp, все они растровые.
1.2 Вектор
Векторная графика - это геометрические примитивы, основанные на математических уравнениях, таких как точки, линии или многоугольники в компьютерной графике для представления изображений.
---- Википедия
Векторная диаграмма отличается от растрового изображения тем, что она не состоит из одного пикселя, а ее суть - математическое выражение. Файл формата svg представляет собой векторную диаграмму.
1.3 Разница между растровым изображением и векторной диаграммой
Наиболее очевидная разница между растровым изображением и векторной диаграммой:Мозаика появится, когда растровое изображение будет увеличено, и качество изображения ухудшится; векторную графику можно бесконечно увеличивать без снижения качества изображения.
Источник изображения: Википедия
На рисунке a представляет исходное изображение. Если a - векторная диаграмма, когда изображение в красной рамке увеличивается, эффект аналогичен b, и вы можете видеть, что качество изображения не снизилось; если a - растровое изображение, когда изображение в красной рамке увеличивается , эффект похож на c, и отчетливо видны один за другим маленькие квадратики, качество изображения значительно снижается.
1.4 Как выразить цвет пикселей
Выберите растровое изображение и увеличьте масштаб до 3200% в PS, как вы можете видеть ниже:
Вы можете ясно видеть один за другим маленькие квадратики, которые являются пикселями.
Пиксель имеет определенное положение и значение цвета. Цвет каждого пикселя представлен комбинацией RGB или значением серого.
В этом разделе основное внимание уделяется тому, как представлять цвета.
По битовой глубине растровые изображения можно разделить на 1, 4, 8, 16, 24 и 32-битные изображения. Битовая глубина здесь относится к количеству битов, используемых для представления цвета пикселя. Если пиксель представлен одним битом цвета, его битовая глубина равна 1, если пиксель представлен четырьмя битами цвета, его битовая глубина равна 4 и так далее.
- Если пиксели изображения1 битДля представления цвета этот бит равен 0 или 1, тогда он может представлять 2 1 Два цвета, а именно черный и белый, фото чисто черно-белое фото.
Если пиксели изображения8 битДля представления цвета эти восемь битов могут представлять 2 8 Цвета, 256. Такой образобычно(Есть исключения, я расскажу об этом ниже) называетсяОттенки серого, Потому что эти 256 цветов являются черным и белым серым (серый здесь означает 244 различных степени серого). Изображение в градациях серого выглядит следующим образом:
Если пиксели изображения24 битДля представления цвета эти 24 бита могут представлять 2 24 Есть более 16 миллионов цветов. Это изображение называетсяКарта истинного цвета. Эти 24 бита разделены на три канала по 8 бит, которые представляют красный, зеленый и синий соответственно. Это метод цветового кодирования RGB, который использует оптическую интенсивность трех основных цветов - красного, зеленого и синего - для представления цвета. Это наиболее распространенный метод кодирования растровых изображений, который можно напрямую использовать для отображения на экране.
2. Формат файла BMP
2.1 Введение в BMP
BMPВзято из сокращения bitmap Bitmap, также известного как DIB (device-independent bitmap), является независимым от дисплеябитовая картаФормат файла цифрового изображения. Обычно встречается в операционных системах Microsoft Windows и OS / 2. ---- Википедия
Формат BMP - это формат, представляющий растровое изображение.
Разрядность пикселей в изображениях формата BMP может быть 1, 4, 8, 24, 32, но обычные битовые глубины BMP по-прежнему равны 8 и 24.
Выберите изображение BMP, щелкните правой кнопкой мыши, чтобы открыть Свойства -> Детали, вы можете просмотреть его битовую глубину.
Когда битовая глубина файла BMP равна 8, это не обязательно означает, что изображение в оттенках серого, как показано ниже:
Разрядность этого изображения составляет 8, но это не изображение в оттенках серого, мы его называемПсевдоцветная карта。
Следующее изображение представляет собой полноцветное изображение с битовой глубиной 24, которое можно использовать для сравнения:
Видно, что качество изображения в истинных цветах значительно выше, чем у изображения в ложных цветах.
2.2 Составление формата файла BMP
Файл BMP состоит из следующих четырех частей:
- Заголовок растрового файла (BITMAPFILEHEADER)
- Заголовок растровой информации (BITMAPINFOHEADER)
- Таблица цветов * (RGBQUAD [])
- Массив пикселей (Pixels [] [])
Поскольку таблица цветов не обязательно существует, добавьте * Описание.
Кратко объясним информацию о каждой части ниже:
2.2.1 Заголовок растрового файла
Используется для описания состояния всего файла BMP, включая такую информацию, как тип, размер файла и начальная позиция растрового изображения файла BMP.
Заголовок файла растрового изображения имеет в общей сложности14 байт。
2.2.2 Заголовок информации о растровом изображении
Используется для описания такой информации, как размер растрового изображения.
Общий заголовок информации о растровом изображении40 байт。
2.2.3 Таблица цветов
Он используется для описания цвета в растровом изображении.Он имеет несколько элементов таблицы.Каждый элемент таблицы представляет собой структуру типа RGBQUAD, которая определяет цвет.
Вы можете видеть, что запись в таблице RGB4 байта。
Количество данных структуры RGBQUAD в таблице цветов определяется заголовком информации о битовой карте.biBitCountЧтобы убедиться:
- Когда biBitCount = 1, 4, 8, есть 2, 16 и 256 записей соответственно.
- При biBitCount = 24 элемент таблицы цветов отсутствует.
2.2.4 Массив пикселей
l Запишите значение каждого пикселя растрового изображения, порядок записи - слева направо в пределах строки развертки и снизу вверх между строками развертки. Количество байтов, занимаемых значением пикселя растрового изображения, выглядит следующим образом:
Когда biBitCount = 1, 8 пикселей занимают 1 байт;
Когда biBitCount = 4, 2 пикселя занимают 1 байт;
Когда biBitCount = 8, 1 пиксель занимает 1 байт;
Когда biBitCount = 24, 1 пиксель занимает 3 байта: R, G, B;
Windows оговаривает, что количество байтов, занимаемых строкой сканирования, должно быть кратно 4 (то есть в единицах длины), и если этого недостаточно, оно заполняется 0.
Три, пример формата файла BMP анализа
Откройте файл grey8.bmp с помощью notepad ++, выберите плагин -> HEX-Editor -> Просмотреть в HEX, если нет, вы можете выбрать управление плагином для установки, окончательный интерфейс выглядит следующим образом:
Это необходимо для отображения информации об изображении в шестнадцатеричной форме, шестнадцатеричное число занимает 4 бита, поэтому одна строка представляет шестнадцать байтов.
Прежде чем анализировать файл BMP, мы должны сначала понять порядок хранения данных:
В файле BMP, если часть данных должна быть представлена несколькими байтами, порядок байтов данных следующий: «младший адрес для хранения младших данных и высокий адрес для хранения высоких данных». Например, порядок хранения данных 0x1756 в памяти:
Этот метод хранения называется прямым порядком байтов (little endian), а противоположный - big endian.
3.1 Заголовок растрового файла
Красный прямоугольник на рисунке ниже - это заголовок файла растрового изображения:
Первые два байта (0, 1) указывают тип файла растрового изображения, а именно 0x4d42 Представляет тип BMP, который совпадает с Первые два байта в DUMP обозначают один и тот же символ BM. 。
Следующие четыре байта (2, 3, 4, 5) указывают размер файла растрового изображения, а именно 0x0000c436 Представляет размер файла точечного рисунка, преобразованного в десятичное значение 50230, мы открываем свойства grey8.bmp и обнаруживаем, что его размер действительно составляет 50230 байт:
Следующие два байта (6, 7) - это зарезервированные слова файла битовой карты 1, которые должны иметь значение 0, то есть 0x0000.
Следующие два байта (8, 9) - это зарезервированное слово 2 файла битовой карты, которое должно быть 0, то есть 0x0000.
Последние четыре байта (a, b, c, d) являются начальной позицией данных растрового изображения, и его значение равно 0x00000436, которое преобразуется в десятичное число 1078. Он представляет собой количество байтов от начала файла до массива пикселей, то есть его размер: заголовок файла растрового изображения (14 байтов) + заголовок информации о растровом изображении (40 байтов) + [256 записей * 4 слова Раздел], потому что запись в таблице цветов не обязательно существует, поэтому используйте [] Приложите. В изображении grey8.bmp есть таблица цветов, поэтому начальное значение растровых данных - 1078.
3.2 Заголовок информации о растровом изображении
Первые четыре байта (e, f в первой строке, 0, 1 во второй строке) представляют количество байтов, занятых заголовком информации о битовой карте, то есть 0x00000028, что при преобразовании в десятичное число равно 40;
Последние четыре байта (2, 3, 4, 5 во второй строке) - это ширина растрового изображения в пикселях, то есть 0x00000100, которое преобразуется в десятичное число 256, что согласуется с реальной ситуацией.
Последние четыре байта (6, 7, 8, 9 во второй строке) - это высота растрового изображения в пикселях, то есть 0x000000c0, которое преобразуется в десятичное 192, что согласуется с реальной ситуацией.
Последние два байта (a, b во второй строке) - это уровень целевого устройства, который должен быть 1, а его значение - 0x0001, что соответствует.
Последние два байта (c, d во второй строке) - это количество битов, необходимых для каждого пикселя, и их значение равно 0x0008, что соответствует фактической битовой глубине.
Последние четыре байта (e, f во второй строке, 0, 1 в третьей строке) указывают тип сжатия битовой карты, и его значение равно 0x00000000, то есть без сжатия.
Последние четыре байта (2, 3, 4, 5 в третьей строке) - это размер растрового изображения, в байтах, значение 0x0000c000, преобразованное в десятичное число 49152, по сути, для вычисления размера массива пикселей, вычислить способ:
b i S i z e I m a g e = Фигура Нравиться из ширина степень ∗ высоко степень ∗ Кусочек глубокий степень / 8 biSizeImage = ширина изображения * высота * битовая глубина / 8 b i S i z e I m a g e = Фигура Нравиться из ширина степень ∗ высоко степень ∗ Кусочек глубокий степень / 8
в изображении grey8.bmp
b i S i z e I m a g e = 256 ∗ 192 ∗ 8 / 8 = 49152 biSizeImage=256*192*8/8=49152 b i S i z e I m a g e = 2 5 6 ∗ 1 9 2 ∗ 8 / 8 = 4 9 1 5 2
Последние четыре байта (6, 7, 8, 9 в третьей строке) представляют горизонтальное разрешение растрового изображения, и его значение равно 0x00002e23.
Последние четыре байта (a, b, c, d в третьей строке) представляют разрешение битовой карты по вертикали, и его значение равно 0x00002e23.
Последние четыре байта (e, f в третьей строке, 0, 1 в четвертой строке) представляют количество цветов в таблице цветов, фактически используемых растровым изображением, и его значение - 0x00000000, обычно равное 0.
Последние четыре байта (2, 3, 4, 5 в четвертой строке) представляют количество важных цветов в процессе отображения растрового изображения, и его значение равно 0x00000000, как правило, равному 0.
3.3 Таблица цветов
Когда битовая глубина равна 24, таблица цветов отсутствует, а за заголовком информации о растровом изображении следует массив пикселей;
Когда битовая глубина не 24, есть таблица цветов, а есть 2 Битовая глубина Каждый элемент таблицы цветов занимает 4 байта.
В желтом поле, как показано на рисунке ниже, находится 256 элементов таблицы цветов с общим размером 256 * 4 байта (показана только его часть):
Поскольку каждый элемент таблицы цветов занимает 4 байта, мы делим элемент таблицы цветов на один элемент таблицы цветов, то есть черный ящик, в единицах по 4 байта.
Поскольку grey8.bmp является изображением в градациях серого, элементы его таблицы цветов основаны на правилах.
В записи таблицы цветов три компонента RGB равны, а четвертый компонент равен 0; во всей таблице цветов значение первых трех компонентов записи таблицы цветов увеличивается на 1 от 0 до 255. Фактически, rgb (0,0,0) представляет черный, rgb (255,255,255) представляет белый, rgb (x, x, x) (x не равно 0 или 255, x является целым числом от 0 до 255) представляет разные градусов серого.
Когда файл BMP представляет собой псевдоцветное изображение, его битовая глубина составляет 8 бит, но нет правила, которому следует следовать. Например, первый элемент таблицы цветов - это rgb (1,22,3,0), второй элемент таблицы цветов - это rgb (10,89,90,0) и т. Д. Это не черный, белый и серый цвета, а другие цвета. Однако они могут отображать только до 256 цветов, что намного меньше, чем 16 миллионов цветов полноцветных изображений. Поэтому такие изображения называются псевдоцветными изображениями.
3.4 Массив пикселей
После таблицы цветов (или заголовка информации о растровом изображении) идет массив пикселей. В этом примере битовая глубина равна 8, поэтому один байт представляет один пиксель. Как определить цвет этого пикселя? Диапазон одного байта составляет [0,255], теперь вы должны понять! Найдите соответствующий элемент таблицы цветов в соответствии со значением этого байта, и цвет, соответствующий этому элементу таблицы цветов, является цветом этого пикселя. Вот как это работает для BMP с таблицами цветов.
Для изображения с истинным цветом его битовая глубина равна 24, и один пиксель, естественно, соответствует трем цветовым компонентам R, G и B, поэтому нет необходимости в таблице цветов, а для изображения с истинным цветом, если есть таблица цветов, то есть более чем 16 миллионов элементов таблицы цветов, весь файл будет очень большим.
Три, эксперимент с кодом
3.1 Экспериментальная среда
- Операционная система: Windows 10
- Компилятор: Dev-cpp, Visual Studio 2017
3.2 Содержание эксперимента
Измените элементы таблицы цветов изображения в градациях серого gray8_test.bmp ниже на случайные значения и превратите исходное изображение в оттенках серого в псевдоцветное изображение.
3.3 Другая информация
Три структуры BITMAPFILEHEADER, BITMAPINFOHEADER и RGBQUAD находятся вwindows.hОпределено в
3.4 Код ключа
Поскольку код имеет подробные комментарии, он не будет здесь подробно объяснен.
- Прочтите соответствующую информацию:
- Используйте функцию случайных чисел для изменения элементов таблицы цветов
- Запишите прочитанную информацию в целевой файл
- Чтение и запись информации о пикселях, обратите внимание на четырехбайтовое выравнивание
3.5 Внимание! ! !
- Откройте файл в двоичном виде! ! ! ! ! ! !
- Обратите внимание, что количество байтов, занимаемых строкой пикселей, кратно 4. При чтении файла считайте больше 0 байтов, добавленных позже; при записи файла запишите еще 0 байтов, которые необходимо заполнить. В противном случае изображение может быть неупорядоченным.
3.6 Результаты
С помощью нашей программы генерируются следующие картинки, которые довольно красивы!
3.7 Полный код
Четыре, расширенный эксперимент
Примечания: Формула преобразования из RGB в шкалу серого: Серый = R * 0,299 + G * 0,587 + B * 0,114
Пять, справочные материалы
[2] Мультимедийные материалы по базовому курсу
[3] Введение в Википедии о «растровом изображении», «векторной диаграмме» и «формате BMP»
Интеллектуальная рекомендация
совместный запрос mysql с тремя таблицами (таблица сотрудников, таблица отделов, таблица зарплат)
1. Краткое изложение проблемы: (внизу есть инструкция по созданию таблицы, копирование можно непосредственно практиковать с помощью (mysql)) Найдите отделы, в которых есть хотя бы один сотрудник. Отоб.
[Загрузчик классов обучения JVM] Третий день пользовательского контента, связанного с загрузчиком классов
IP, сеанс и cookie
Читайте также: