Как сделать файл 24 битным

Обновлено: 03.07.2024

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

При преобразовании цветного изображения в битовый режим это изображение сначала нужно перевести в режим градаций серого. В результате из пикселов удаляется информация о цветовом тоне и насыщенности и остаются только значения яркости. Но, поскольку для битовых изображений доступно очень немного функций редактирования, обычно имеет смысл редактировать эти изображения в режиме градаций серого и только затем преобразовывать их в битовый режим.

Регулярный дизеринг Преобразует изображение, формируя из уровней серого геометрические структуры, состоящие из черных и белых точек.

Случайный дизеринг Преобразует изображение с использованием метода диффузии, начиная с левого верхнего пиксела изображения. Если значение пиксела выше среднего серого (128), он становится белым, если ниже – черным. Поскольку исходный пиксел редко бывает просто белым или просто черным, неизбежно возникает погрешность, которая переносится на окружающие пикселы и случайным образом распределяется по изображению, образуя гранулярную, зернистую текстуру. Этот параметр полезен при просмотре изображений на черно-белом экране.

Полутоновый растр Имитирует в преобразованном изображении полутоновые точки. В диалоговом окне "Полутоновый растр" вводятся следующие значения:

В поле "Линиатура" укажите значение линиатуры растра, выбрав единицу измерения. Значение может находиться в диапазоне от 1 до 999 (для линий на дюйм) и от 0,400 до 400 (для линий на сантиметр). Можно вводить десятичные значения. Линиатура растра определяет частоту полутонового растра в линиях на дюйм (lpi). Линиатура зависит от используемой при печати марки бумаги и типа печатной машины. Для газет обычно используется линиатура в 85 линий, а для журналов – в 133 или 150 lpi. Уточните правильное значение линиатуры в своей типографии.

Введите значение угла растра в градусах от –180 до +180. Это значение определяет ориентацию растра. Одноцветные и черно-белые полутоновые растры обычно имеют угол 45°.

В поле "Фигура" выберите желательную форму точки.

Важная информация: Полутоновый растр становится частью изображения. Если изображение печатается на полутоновом принтере, то наряду с полутоновым растром, входящим в изображение, принтер использует еще и собственный полутоновый растр. В результате на некоторых принтерах возможно появление муара.

Заказной узор Имитирует в преобразованном изображении заказной полутоновый растр. Выберите узор, для которого можно изменить толщину, – обычно узор с множеством оттенков серого.

Чтобы воспользоваться этим параметром, необходимо сначала определить узор и отрастрировать изображение в градациях серого для применения текстуры. Чтобы покрыть все изображение, размер узора должен быть не меньше размера изображения. В противном случае узор будет повторяться мозаикой. В комплекте Photoshop поставляется несколько самоповторяющихся узоров, которые могут быть использованы для полутонового растра.


Чтобы подготовить для преобразования черно-белый узор, преобразуйте изображение в градации серого и несколько раз примените фильтр "Размытие +". В результате получатся толстые линии с постепенными переходами от темно-серого до белого.

Создайте в графическом редакторе 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).

JPEG – это наиболее распространенный и популярный формат растрового изображения. Свое название форма получил по аббревиатуре от названия организации-разработчика Joint Photographic Experts Group. Файлы такого формата используются сегодня во всех цифровых фотоаппаратах и камерах. Они имеют хорошую степень сжатия и поддерживают глубину цвета в 24 бит. Поскольку такое сжатие существенно уменьшают размер изображения практически без потери качества, формат JPEG широко распространен в Интернете. Однако чем сильнее сжатие, тем хуже качество. К тому же формат JPEG не поддерживает опцию прозрачности.

BMP — это графический формат, который позволяет хранить растровые изображения в виде точечного рисунка на основе однослойных растров. Его разработала компания Microsoft. Она же реализовала его в операционной системе Windows. Формат BMP (англ. Bitmap Picture) применяется в работе многих программ, поскольку его поддержка интегрирована в ОС Windows и OS/2. Файлы этого формата могут иметь расширения .bmp, .dib либо .rle. BMP-формат графики часто изменялся. С самого начала структура изображения была построена путем сочетания небольших квадратиков, то есть пикселей, каждый из которых способен содержать данные о том, какова глубина цвета. Она бывает 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксель. Размер конечной картинки зависит от битности. Формат файла BMP и поныне смотрится монстром, так как у него большие размеры. Ведь изображение несжатое, чего не скажешь, например, про формат JPG. Любая ОС Windows располагает средствами для того, чтобы открыть такие изображения. Главным средством редактирования всегда была Paint – родная программа Microsoft, которая есть в каждой версии Windows. В BMP изображения хранятся в оригинальном виде, но можно использовать и алгоритмы сжатия. Скажем, BMP осуществляет качественную поддержку RLE-сжатия.

Сконвертируйте ваши jpg-файлы в bmp онлайн и бесплатно

Объединенная группа экспертов в области фотографии

Расширение JPG присвоено файлам изображений. Множество фотографии и веб-графика сохраняется в JPG. В целях сжатия растровые изображения сохраняются в .jpg, что облегчает передачу и загрузку этих файлов через Интернет. JPG-формат основан на 24-битной цветовой палитре. Чем больше уровень сжатия, применяемый при создании JPG-файла, тем хуже становится качество изображения при его распаковке.

Файл точечного рисунка

BMP ― это формат для сохранения растровых изображений. В этом формате можно сохранять однослойные растровые изображения. Каждый пиксель в различных файлах может быть различного размера в битах. В последних версиях BMP имеется возможность управления цветом. В частности, можно указать конечные точки, выполнить гамма-коррекцию и встроить цветовые профили ICC.

Софт, исходники и фото

Эта статья про то, как выглядит графический формат bmp. Хоть это и один из простых форматов, но из-за того, что существует много вариаций этого формата, то не все моменты очевидны. Итак, хватит лить воду, начнем.

Структуры формата

Для начала приведем графическое представление данных в bmp (картинка взята из MSDN).

В начале стоит заголовок файла (BITMAPFILEHEADER). Он описан следующим образом:

Здесь и далее будем считать, что переменная bfh объявлена как BITMAPFILEHEADER bfh;

А дальше идет структура BITMAPINFOHEADER, которая объявлена так:

Виды формата BMP

Хранение данных в формате bmp

Сразу за палитрой идет сам растр. Тут уже более запутано. Во-первых, пиксели тут описываются так, как написано в таблице выше в зависимости от формата. И могут сами содержать значение компонентов цвета (для беспалитровых), а могут быть индексами массива-палитры. Сама картинка записывается построчно. Во-вторых, картинка идет как бы перевернутая вверх ногами. То есть сначала записана нижняя строка, потом предпоследняя и так далее до самого верха. И, в-третьих, как написано в [1], если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна параграфу. Вот это и есть самое неприятное. Дело в том, что для каждого формата приходится подстраивать это число пустых байтов (правда, я люблю туда записывать часть палитры, просто мне не хочется заводить лишние "нулевые" переменные, если все-равно эти байты пропускают и никому они не нужны). Я привожу таблицу с формулами, которые показывают для какого формата сколько байт надо дописывать в конец строки. Там под переменной Width, как можно догадаться, подразумевается ширина картинки. Все эти формулы были установлены экспериментально. Я приведу пример только для наиболее используемых форматов. Для остальных вы можете написать сами.

biBitCountФормула на С
8(3 * Width) % 4
16(2 * Width) % 4
24Width % 4

Примеры программ

Все исходники вы можете скачать отсюда.Я особо не буду тут много писать. Просто приведу функции с комментариями.

Привет 1. Создание картинки в формате bmp.
Здесь создается однотонная картинка. В примерах таких функций три: создание bmp 8, 16 и 24 бит. Я приведу только для 16-битных.

// Создадим картинку в формате bmp 16 бит типа 5-5-5, которая будет просто однотонной
void CreateBmp555 ( char * fname, WORD color )
<
HANDLE hFile ;
DWORD RW ;
int i, j ;

// Объявим нужные структуры
BITMAPFILEHEADER bfh ;
BITMAPINFOHEADER bih ;
BYTE Palette [ 1024 ] ; // Палитра

// Пусть у нас будет картинка размером 35 x 50 пикселей
int W >= 35 ;
int Height = 50 ;

memset ( Palette, 0 , 1024 ) ; // В палитре у нас нули заполним их
memset ( & bfh, 0 , sizeof ( bfh ) ) ;

hFile = CreateFile ( fname, GENERIC_WRITE, 0 , NULL , CREATE_ALWAYS, 0 , NULL ) ;
if ( hFile == INVAL >)
return ;

// Запишем палитру
WriteFile ( hFile, Palette, 1024 , & RW, NULL ) ;
for ( i = 0 ; i Height ; i ++ )
<
for ( j = 0 ; j W >; j ++ )
<
WriteFile ( hFile, & color, sizeof ( color ) , & RW, NULL ) ;
>

// Выровняем по границе
WriteFile ( hFile, Palette, ( sizeof ( color ) * W >) % 4 , & RW, NULL ) ;
>
CloseHandle ( hFile ) ;
>

Пример 2. Преобразование картинки из формата 8 бит (256 цветов) в 24 бит.

BOOL Convert256To24 ( char * fin, char * fout )
<
BITMAPFILEHEADER bfh ;
BITMAPINFOHEADER bih ;
int W >;
RGBQUAD Palette [ 256 ] ;
BYTE * inBuf ;
RGBTRIPLE * outBuf ;
HANDLE hIn, hOut ;
DWORD RW ;
DWORD OffBits ;
int i, j ;

hIn = CreateFile ( fin, GENERIC_READ, FILE_SHARE_READ, NULL , OPEN_EXISTING, 0 , NULL ) ;
if ( hIn == INVAL >)
return FALSE ;

hOut = CreateFile ( fout, GENERIC_WRITE, 0 , NULL , CREATE_ALWAYS, 0 , NULL ) ;
if ( hOut == INVAL >)
<
CloseHandle ( hIn ) ;
return FALSE ;
>

// Прочтем данные
ReadFile ( hIn, & bfh, sizeof ( bfh ) , & RW, NULL ) ;
ReadFile ( hIn, & bih, sizeof ( bih ) , & RW, NULL ) ;
ReadFile ( hIn, Palette, 256 * sizeof ( RGBQUAD ) , & RW, NULL ) ;

// Установим указатель на начало растра
SetFilePointer ( hIn, bfh. bfOffBits , NULL , FILE_BEGIN ) ;
W >= bih. biWidth ;
Height = bih. biHeight ;
OffBits = bfh. bfOffBits ;

// Выделим память
inBuf = new BYTE [ W >] ;
outBuf = new RGBTRIPLE [ W >] ;

// Заполним заголовки
bfh. bfOffBits = sizeof ( bfh ) + sizeof ( bih ) ; // Не будем писать палитру
bih. biBitCount = 24 ;
bfh. bfSize = bfh. bfOffBits + 4 * W >* Height + Height * ( W >% 4 ) ; // Размер файла

// А остальное не меняется
// Запишем заголовки
WriteFile ( hOut, & bfh, sizeof ( bfh ) , & RW, NULL ) ;
WriteFile ( hOut, & bih, sizeof ( bih ) , & RW, NULL ) ;

// Начнем преобразовывать
for ( i = 0 ; i Height ; i ++ )
<
ReadFile ( hIn, inBuf, W >& RW, NULL ) ;
for ( j = 0 ; j W >; j ++ )
<
outBuf [ j ] . rgbtRed = Palette [ inBuf [ j ] ] . rgbRed ;
outBuf [ j ] . rgbtGreen = Palette [ inBuf [ j ] ] . rgbGreen ;
outBuf [ j ] . rgbtBlue = Palette [ inBuf [ j ] ] . rgbBlue ;
>
WriteFile ( hOut, outBuf, sizeof ( RGBTRIPLE ) * W >& RW, NULL ) ;

// Пишем мусор для выравнивания
WriteFile ( hOut, Palette, W >% 4 , & RW, NULL ) ;
SetFilePointer ( hIn, ( 3 * W >) % 4 , NULL , FILE_CURRENT ) ;
>

delete inBuf ;
delete outBuf ;
CloseHandle ( hIn ) ;
CloseHandle ( hOut ) ;
return TRUE ;
>

В функцию надо передавать имена исходного и конечного файла соответственно.

Источники

  1. Д. Гончаров, Т. Салихов. "DirectX 7.0 для программистов"
  2. MSDN

Читайте также: