256 Bmp Картинки

256 Bmp Картинки

KB/graphics/rle8bitmap/RLEBmp.gif' alt='256 Bmp Картинки' title='256 Bmp Картинки' />Описание формата BMP. Хоть это и один из простых форматов, но из за того, что существует много вариаций этого формата, то не все моменты очевидны. Формат BMP один из первых графических форматов. Итак, хватит лить воду, начнем. Он описан следующим образом  typedefstruct tag. BITMAPFILEHEADER. Матушка Алипия Книга тут. Здесь он должен быть BM. Если Вы откроете любой файл BMP в текстовом а лучше в 1. BM от слова Bit. Map, как вы уже, наверное, догадались. Строго говоря вы должны его высчитывать что рекомендуется, но я ставил размер файла неправильно правда, не нарочно и никаких проблем не было ACDSee читало без проблем, моя программа работала, но я вам не рекомендую писать его заведомо неправильно, вдруг появится добросовестная программа, которая сверит этот размер с настоящим и решит, что это не bmp, а что нибудь другое. В идеале все программы для того, чтобы убедиться, что перед ними действительно bmp, а не подделка, должны, во первых, проверить, что bf. Type содержит. Это один из самых важных полей в этой структуре. Он показывает, где начинается сам битовый массив относительно начала файла или, как написано в MSDN,. То есть, чтобы гарантированно попадать на начало массива вы должны писать Set. File. Pointer h. 256 Bmp КартинкиFile, bfh. Off. Bits, NULL, FILE. Ее нужно инициализировать следующим образом bih. Size sizeof BITMAPINFOHEADER Снова здесь и дальше будем считать, что bih объявлена следующим образом BITMAPINFOHEADER bih bi. Width и bi. Height задают соответственно ширину и высоту картинки в пикселях. Пока оно всегда устанавливается в 1. Подробнее про это поговорим ниже. Bmp Картинки' title='256 Bmp Картинки' />Статья с описанием графического формата BMP и примеры его. И мне надо было преобразовывать входящие картинки из 256 цветов. Bmp Картинки' title='256 Bmp Картинки' />256 Bmp КартинкиНе удивляйтесь и не пугайтесь, что в bmp и вдруг сжатие. Я лично не видел не одной сжатой bmp но я не говорю, что таких не существует. Если сжатия нет, то этот флаг надо устанавливать в BI. В этой статье мы говорим про несжатый формат, поэтому другие флаги я даже не буду перечислять. Похоже, что эта же структура используется и в файлах JPEG и PNG, потому что, начиная с Windows 9. BI. Если изображение несжато то есть предыдущее поле установлено в BI. Приложение может использовать это значение для того, чтобы выбирать из группы ресурсов наиболее подходящий битовый массив для нужного устройства. Дело в том, что формат bmp это по сути аппаратно независимый растр, то есть когда внешний вид того, что получается не зависит от того, на что этот растр проецируется если можно так выразится. Например, картинка будет выглядеть одинаково вне зависимости от того, рисуется она на экране монитора или печатается на принтере. Но вот разрешение у устройств разное, и именно для того, чтобы выбрать наиболее подходящую картинку из имеющихся и используют эти параметры. Если это значение равно нулю, то в растре используется максимально возможное количество цветов, которые разрешены значением bi. Bit. Count. Это актуально только для сжатых картинок. Если bi. Clr. Used не нуль и bi. Bit. Count меньше 1. Clr. Used определяет текущее число цветов графического движка или доступного драйвера устройства. Если bi. Bit. Count больше или равно 1. Clr. Used определяет размер таблицы цветов, используемой для оптимизации текущей системной палитры. Определяет число цветов, которые необходимы для того, чтобы изобразить рисунок. Если это значение равно 0 как это обычно и бывает, то все цвета считаются важными. То есть используется в данном с формате палитра или нет. Заметьте, что палитра может быть даже в беспалитровых форматах, только там она не используется. В беспалитровых bmp цвет высчитывается прямо из тех битов, которые идут в файле, начиная с некоторого места. А в палитровых каждый байт описывает один или несколько пикселей, причем значения байта или битов это индекс цвета в палитре. Для начала приведу таблицу, которая сравнивает возможные варианты. Вид картинки палитровая или беспалитровая зависит от того, сколько бит отдается на один пиксель, то есть от значения bi. Bit. Count структуры BITMAPINFOHEADER. Если бит растра что это такое чуть ниже сброшен равен 0, то это значит, что на этом месте должен быть первый цвет из палитры, а если установлен равен 1, то второй. Палитровый. 16. Каждый байт описывает 2 пикселя. Вот пример из MSDN. Если первый байт в картинке 0x. F, то он соответствует двум пикселям, цвет первого второй цвет из палитры потому что отсчет идет от нуля, а второй пиксель 1. Палитровый. 25. 6Один из самых распространенных вариантов. Но в то же время и самых простых. Палитра занимает один килобайт но на это лучше не рассчитывать. Один байт это один цвет. Причем его значение это номер цвета в палитре. Беспалитровый. 21. Это самый запутанный вариант. Начнем с того, что он беспалитровый, то есть каждые два байта одно слово WORD в растре однозначно определяют один пиксель. Но вот что получается битов то 1. Красный, Зеленый, Синий. А 1. 6 никак на 3 делиться не хочет. Поэтому здесь есть два варианта. Первый использовать не 1. Таким образом мы можем использовать максимум 21. R G B 5 5 5. Но тогда за зря теряется целый бит из 1. Но так уж случилось, что наши глаза среди всех цветов лучше воспринимают зеленый цвет, поэтому и решили этот один бит отдавать на зеленую компоненту, то есть тогда получается тройка R G B 5 6 5, и теперь мы может использовать 21. Но что самое неприятное, что используют оба варианта. В MSDN предлагают для того, чтобы различать сколько же цветов используется, заполнять этим значением поле bi. Clr. Used из структуры BITMAPINFOHEADER. Чтобы выделить каждую компоненту надо использовать следующие маски. Для формата 5 5 5 0x. F для синей компоненты, 0x. E0 для зеленой и 0x. C0. 0 для красной. Для формата 5 6 5 0x. F синяя, 0x. 07. E0 зеленая и 0x. F8. 00 красная компоненты соответственно. Беспалитровый. 22. А это самый простой формат. Здесь 3 байта определяют 3 компоненты цвета. То есть по компоненте на байт. Просто читаем по структуре RGBTRIPLE и используем его поля rgbt. Blue, rgbt. Green, rgbt. Red. Они идут именно в таком порядке. Беспалитровый. 23. Здесь 4 байта определяют 3 компоненты. Но, правда, один байт не используется. Его можно отдать, например, для альфа канала прозрачности. Читать растр в данном случае удобно структурами RGBQUAD, которая описана так typedefstruct tag. RGBQUAD. После структур BITMAPFILEHEADER и BITMAPINFOHEADER идет палитра. Причем, если формат беспалитровый, то ее может и не быть, однако, на это рассчитывать не надо. Дело в том, что, когда я только начинал разбираться с форматом bmp, в одной книжке я вычитал, что, якобы, если формат беспалитровый, то у нее вообще нет палитры. Там даже были две картинки схемы формата одна с палитрой, другая без. А я в это время писал программу, которая усердно оперирует с bmp шками. И мне надо было преобразовывать входящие картинки из 2. И я в 2. 4 битных палитру просто не создавал bf. Off. Bits из структуры BITMAPFILEHEADER у меня был равен сумме sizeofBITMAPFILEHEADER sizeof BITMAPINFOHEADER, а входящие 2. С 2. 56 цветными растрами все работало как надо, пока мне не попалась 2. Я не сразу понял в чем дело. Пока не сравнил размер исходного файла с теоретическим, который должен был быть, не будь палитры. Разница оказалась ровно 1 Kб ровно 1. Там была палитра. Поэтому никогда не рассчитывайте на то, есть ли палитра и не надейтесь на ее размер хотя все картинки, которые мне попадались имели размер палитры 2. Кб, всегда перемещайтесь по файлу на начало растра, используя bf. Off. Bits. Палитра представляет из себя массив структур RGBQUAD идущих друг за другом. Даже если в палитре используются не все цвета а только, например, 1. А 2. 56 4 1. 02. RGBQUAD, то есть и получается тот самый один килобайт. Тут уже более запутано. Во первых, пиксели тут описываются так, как написано в таблице выше в зависимости от формата. И могут сами содержать значение компонентов цвета для беспалитровых, а могут быть индексами массива палитры. Сама картинка записывается построчно. Во вторых, картинка идет как бы перевернутая вверх ногами. То есть сначала записана нижняя строка, потом предпоследняя и так далее до самого верха. И, в третьих, как написано в. Вот это и есть самое неприятное.

256 Bmp Картинки
© 2017