Смотреть что такое "BMP" в других словарях. Расширение файла BMP Расширение файла bmp указывает на то

BMP (от англ. Bitmap Picture ) - формат хранения растровых изображений , разработанный компанией Microsoft.

С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы Windows и OS/2 . Файлы формата BMP могут иметь расширения.bmp , .dib и.rle . Кроме того, данные этого формата включаются в двоичные файлы ресурсов RES и в PE-файлы .

Компания Microsoft так же разработала для своих нужд форматы ICO и CUR, которые имеют похожую на BMP структуру. Кроме этого, структуры из этого формата используются некоторыми WinAPI-функциями подсистемы GDI .

Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксель , но глубина 2 бита на пиксель официально не поддерживается. При этом для глубины цвета меньше 16 бит используется палитра с полноцветными компонентами глубиной 24 бита.

В формате BMP изображения могут храниться как есть или же с применением некоторых распространённых алгоритмов сжатия. В частности, формат BMP поддерживает RLE -сжатие без потери качества, а современные операционные системы и программное обеспечение позволяют использовать JPEG и PNG (эти форматы встраиваются в BMP как в контейнер).

DIB и DDB

При использовании формата DIB (англ. Device Independent Bitmap , аппаратно-независимый растр) программист может получить доступ ко всем элементам структур, описывающих изображение, при помощи обычного указателя. Но эти данные не используются для непосредственного управления экраном, так как они всегда хранятся в системной памяти, а не в специализированной видеопамяти . Формат пикселя в оперативной памяти может отличаться от того формата, который должен заноситься в видеопамять для индикации точки такого же цвета. Например, в DIB-формате может использоваться 24 бита для задания пикселя, а графический адаптер в этот момент может работать в режиме HiColor с цветовой глубиной 16 бит. При этом ярко-красная точка в аппаратно-независимом формате будет задаваться тремя байтами 0x0000ff, а в видеопамяти - словом 0xF800. При копировании картинки на экран система будет тратить дополнительное время на преобразование кодов цвета из 24-битного формата в формат видеобуфера.

Обзор структуры файла

BMP-файл состоит из четырёх частей:

  1. Заголовок файла (BITMAPFILEHEADER)
  2. Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Палитра (может отсутствовать)
  4. Само изображение

BITMAPFILEHEADER

Эта структура содержит информацию о типе, размере и представлении данных в файле. Размер 14 байт.

Typedef struct tagBITMAPFILEHEADER { WORD bfType; // смещение 0 байт от начала файла DWORD bfSize; // смещение 2 байта от начала файла, длина 4 байта WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; // смещение 10 байт от начала файла, длина 4 байта } BITMAPFILEHEADER, * PBITMAPFILEHEADER;

Тип WORD должен иметь размер 16 бит , типы DWORD и LONG - 32 бита, тип LONG - знаковый, порядок байтов подразумевается little endian .

  • bfType - тип файла, символы «BM» (в HEX: 0x42 0x4d).
  • bfSize - размер всего файла в байтах .
  • bfReserved1 и bfReserved2 - зарезервированы, должны содержать нули.
  • bfOffBits - содержит смещение в байтах от начала структуры BITMAPFILEHEADER до непосредственно битов изображения.

После заголовка файла

BITMAPINFOHEADER

Наиболее простой вариант заголовка. Приложения для Windows NT3.51 и более ранних могут использовать только эту структуру. Размер 40 байт.

Typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, * PBITMAPINFOHEADER;

BiSize Размер данной структуры в байтах. Формат BMP со временем дополнялся и по значению этого поля определяется версия формата. biWidth Ширина изображения в пикселях. Для Win98/Me и Win2000/XP: если поле biCompression содержит BI_JPEG или BI_PNG, здесь указана ширина распакованного изображения. biHeight Высота изображения в пикселях. Если содержит положительное значение - изображение записано в порядке снизу-вверх (нулевой пиксель в нижнем левом углу). Если значение отрицательное - изображение записано сверху-вниз (нулевой пиксель в верхнем левом углу изображения). Поле biCompression должно содержать значение BI_RGB или BI_BITFIELDS. Такое изображение не может быть сжато. biPlanes Количество цветовых плоскостей и в формате BMP содержит единицу. biBitCount Количество бит на пиксель. Может принимать следующие значения:

  • 0 - имеет смысл для Win98/Me/2000/XP. Число бит на пиксель определяет формат JPEG или PNG.
  • 1 - изображение монохромное. Член bmiColors структуры BITMAPINFO содержит два элемента. Каждый бит изображения представляет один пиксель; если бит равен нулю - пиксель имеет цвет первого элемента таблицы bmiColors, иначе - цвет второго.
  • 4 - шестнадцатицветное изображение. Пиксели определяются 4-х битными индексами, каждый байт изображения содержит информацию о двух пикселях - старшие 4 бита для первого, оставшиеся - для второго.
  • 8 - в палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пикселя.
  • 16 - если поле biCompression содержит значение BI_RGB, файл не содержит палитры. Каждые два байта изображения хранят интенсивность красной, зелёной и синей компоненты одного пикселя. При этом старший бит не используется, на каждую компоненту отведено 5 бит: 0RRRRRGGGGGBBBBB.
    Если поле biCompression содержит значение BI_BITFIELDS, палитра хранит три четырёхбайтовых значения, определяющих маску для каждой из трёх компонент цвета. Каждый пиксель изображения представлен двухбайтным значением, из которого с помощью масок извлекаются цветовые компоненты. Для WinNT/2000/XP - последовательности бит каждой компоненты должны следовать непрерывно, не перекрываясь и не пересекаясь с последовательностями других компонент. Для Win95/98/Me - поддерживаются только следующие маски: 5-5-5, где маска синей компоненты 0х001F, зелёной 0x03E0, красной 0x7C00; и 5-6-5, где маска синей компоненты 0x001F, зелёной 0x07E0, красной 0xF800.
  • 24 - палитра не используется, каждая тройка байт изображения представляет один пиксель, по байту для интенсивности синего, зелёного и красного канала соответственно.
  • 32 - Если поле biCompression содержит значение BI_RGB, изображение не содержит палитры. Каждые четыре байта изображения представляют один пиксель, по байту для интенсивности синего, зелёного и красного канала соответственно. Старший байт каждой четвёрки обычно не используется, однако позволяет хранить данные альфа-канала.
    Если поле biCompression содержит значение BI_BITFIELDS, в палитре хранятся три четырёхбайтных цветовых маски - для красной, зелёной и синей компоненты. Каждый пиксель изображения представлен четырьмя байтами. WinNT/2000: маски компонент не должны перекрываться или пересекаться. Windows 95/98/Me: система поддерживает только один режим сжатия, полностью аналогичный режиму без компрессии BI_RGB - старший байт каждой четвёрки используется в качестве альфа-канала, следующие три отведены для синего, зелёного и красного канала соответственно: 0xAARRGGBB.
biCompression Тип сжатия для сжатых изображений:
Значение Идентификатор Компрессия
0 BI_RGB несжатое изображение
1 BI_RLE8 сжатие RLE для 8-битных изображений
2 BI_RLE4 сжатие RLE для 4-битных изображений
3 BI_BITFIELDS изображение не сжато, палитра содержит три 4-байтные маски для красной, зелёной и синей компонент цвета. Используется для 16- и 32-битных изображений
4 BI_JPEG Win98/Me/2000/XP: JPEG -сжатие
5 BI_PNG Win98/Me/2000/XP: PNG -сжатие
6 BI_ALPHABITFIELDS WinCE: изображение не сжато, палитра содержит четыре 4-байтные маски для красной, зелёной, синей и прозрачной (альфа-канал) компонент цвета. Используется для 16- и 32-битных изображений
biSizeImage Размер изображения в байтах. Может содержать ноль для BI_RGB-изображений. Win98/Me/2000/XP: если biCompression содержит BI_JPEG или BI_PNG, biSizeImage указывает размер BI_JPEG или BI_PNG буфера изображения. biXPelsPerMeter Горизонтальное разрешение в пикселях на метр для целевого устройства. Приложение может использовать это значение для выбора из группы ресурсов изображения, наиболее подходящего для текущего устройства. Для DPI 96, которое принято в Microsoft для мониторов, оно будет равно 3780 (если считать по формуле (96 / 25,4) * 1000). biYPelsPerMeter Вертикальное разрешение в пикселях на метр для целевого устройства. biClrUsed Количество используемых цветовых индексов в палитре. Если значение равно нулю - изображение использует максимально доступное количество индексов, в соответствии со значением biBitCount и методом сжатия, указанным в biCompression.
Если содержит ненулевое значение и biBitCount меньше 16, biClrUsed указывает количество цветов, к которым будет обращаться драйвер устройства или приложение. Если biBitCount больше или равен 16, biClrUsed размер палитры, используемой для оптимизации работы системных палитр. Если biBitCount равен 16 или 32, оптимальная палитра следует сразу после трёх четырёхбайтных масок.
В упакованном изображении массив пикселей следует сразу после структуры BITMAPINFO, biClrUsed должен содержать ноль, либо реальный размер палитры. biClrImportant Количество элементов палитры, необходимых для отображения изображения. Если содержит ноль - все индексы одинаково важны.

Структура BITMAPINFO объединяет BITMAPINFOHEADER и палитру, предоставляя полное описание размеров и цветов изображения.

Чтобы найти палитру в структуре BITMAPINFO, приложение должно использовать информацию, хранимую в biSize, следующим образом:

PColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo-> bmiHeader.biSize ) ) ;

Растр обычно хранится в вертикально зеркальном виде. Но есть также возможность хранить растр не в вертикально зеркальном виде. Признак того, что растр в BMP не в вертикально зеркальном виде задаётся параметром biHeight.

BITMAPV4HEADER

Расширенная версия описанной выше структуры. Win NT 3.51 и более ранние должны использовать структуру BITMAPINFOHEADER. Win98/Me/2000/XP могут использовать вместо структуры BITMAPV4HEADER структуру BITMAPV5HEADER.

Typedef struct { DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; LONG bV4YPelsPerMeter; DWORD bV4ClrUsed; DWORD bV4ClrImportant; DWORD bV4RedMask; DWORD bV4GreenMask; DWORD bV4BlueMask; DWORD bV4AlphaMask; DWORD bV4CSType; CIEXYZTRIPLE bV4Endpoints; DWORD bV4GammaRed; DWORD bV4GammaGreen; DWORD bV4GammaBlue; } BITMAPV4HEADER, * PBITMAPV4HEADER;

Поля от начала структуры и до bV4ClrImportant включительно имеют то же назначение, что и соответствующие поля структуры BITMAPINFOHEADER.

  • bV4RedMask - цветовая маска красной компоненты каждого пикселя, используется только если bV4Compression содержит значение BI_BITFIELDS.
  • bV4GreenMask - цветовая маска зелёной компоненты каждого пикселя, используется только если bV4Compression содержит значение BI_BITFIELDS.
  • bV4BlueMask - цветовая маска синей компоненты каждого пикселя, используется только если bV4Compression содержит значение BI_BITFIELDS.
  • bV4AlphaMask - маска, определяющая компоненту альфа-канала.
  • bV4CSType - определяет цветовое пространство изображения.
  • bV4Endpoints - структура CIEXYZTRIPLE, указывающая x, y и z координаты трёх цветов, которые соответствуют конечным точкам(endpoints) цветового пространства, определённого для изображения. Это поле игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB.
  • bV4GammaRed - кривая тона красной компоненты. Игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB. Указывается в формате 16×16.
  • bV4GammaGreen - кривая тона зелёной компоненты. Игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB.
  • bV4GammaBlue - кривая тона синей компоненты. Игнорируется, если bV4CSType не содержит значения LCS_CALIBRATED_RGB.

BITMAPV5HEADER

Win95/NT 4.0: приложения могут использовать BITMAPV4HEADER. Win NT 3.51 и более ранние должны использовать структуру BITMAPINFOHEADER.

Typedef struct { DWORD bV5Size; LONG bV5Width; LONG bV5Height; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compression; DWORD bV5SizeImage; LONG bV5XPelsPerMeter; LONG bV5YPelsPerMeter; DWORD bV5ClrUsed; DWORD bV5ClrImportant; DWORD bV5RedMask; DWORD bV5GreenMask; DWORD bV5BlueMask; DWORD bV5AlphaMask; DWORD bV5CSType; CIEXYZTRIPLE bV5Endpoints; DWORD bV5GammaRed; DWORD bV5GammaGreen; DWORD bV5GammaBlue; DWORD bV5Intent; DWORD bV5ProfileData; DWORD bV5ProfileSize; DWORD bV5Reserved; } BITMAPV5HEADER, * PBITMAPV5HEADER;

Для полей от начала структуры и до bV5GammaBlue включительно будут описаны только отличия от предыдущих версий - BITMAPINFOHEADER и BITMAPV4HEADER.

  • bV5CSType - определяет цветовое пространство изображения, может принимать следующие значения:
LCS_CALIBRATED_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent - может принимать следующие значения:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • bV5ProfileData - смещение в байтах от начала структуры к началу данных профиля (имя файла профиля, строка состоящая исключительно из символов кодовой таблицы 1252 и заканчивающаяся нулевым байтом). Игнорируется, если bV5CSType содержит значение, отличное от PROFILE_LINKED и PROFILE_EMBEDDED.
  • bV5ProfileSize - размер данных профиля в байтах.
  • bV5Reserved - зарезервировано. Содержит ноль.

Палитра

Палитра может содержать последовательность четырёхбайтовых полей по числу доступных цветов (256 для 8-битного изображения). Три младшие байта каждого поля определяют интенсивность красной, зелёной и синей компоненты цвета, старший байт не используется. Каждый пиксель изображения описан в таком случае одним байтом, содержащим номер поля палитры, в котором сохранен цвет этого пикселя.

Если пиксель изображения описывается 16-битным числом, палитра может хранить три двухбайтных значения, каждое из которых определяет маску для извлечения из 16-битного пикселя красной, зелёной и синей компонент цвета.

Файл BMP может не содержать палитры, если в нём хранится несжатое полноцветное изображение.

Данные изображения

Последовательность пикселей, записанных в том или ином виде. Пиксели хранятся построчно, снизу вверх. Каждая строка изображения дополняется нулями до длины, кратной четырём байтам.

В bmp-файлах с глубиной цвета 24 бита, байты цвета каждого пикселя хранятся в порядке BGR (Blue,Green,Red)

B bmp-файлах с глубиной цвета 32 бита, байты цвета каждого пикселя хранятся в порядке BGRA (Blue,Green,Red,Alpha)

Битность изображения

В зависимости от количества представляемых цветов, на каждую точку отводится от 1 до 48 битов:

  • 1 бит - монохромное изображение (два цвета).
  • 2 бита - 4 возможных цвета (режимы работы CGA) (2-битовый режим официально не стандартизован, но используется).
  • 4 бита - 16-цветное изображение (режимы работы EGA).
  • 8 бит (1 байт) - 256 цветов, последний из режимов, поддерживавших индексированные цвета (см. ниже).
  • 16 бит (2 байта) - режим HiColor, Для 5-6-5 = 65536 возможных оттенков, для 5-5-5 = 32768 возможных оттенков.
  • 24 бита (3 байта) - TrueColor . В связи с тем, что 3 байта не очень хорошо соотносятся со степенями двойки (особенно при хранении данных в памяти, где выравнивание данных по границе слова имеет значение), вместо него часто используют 32-битное изображение. В режиме TrueColor на каждый из трёх каналов (в режиме RGB) отводится по 1 байту (256 возможных значений), общее количество цветов равно .
  • 32 бита (4 байта) - этот режим практически аналогичен TrueColor, четвёртый байт обычно не используется, или в нём располагается альфа-канал (прозрачность).
  • 48 бит (6 байт) - редко используемый формат с повышенной точностью передачи цвета (16 бит на канал), поддерживается относительно малым количеством программ и оборудования.

Индексированные цвета

При количестве бит 1 (2 цвета), 2 (4 цвета), 4 (16 цветов) или 8 (256 цветов) на каждый пиксель, может использоваться специальный режим индексированных цветов . В этом случае число, соответствующее каждому пикселю, указывает не на цвет, а на номер цвета в палитре. Благодаря использованию палитры имеется возможность адаптировать изображение к цветам, присутствующим на изображении. В таком случае изображение ограничено не заданными цветами, а максимальным количеством одновременно используемых цветов.

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

Следующая программа открывает 24 битный BMP файл в окне XWindow, глубина цвета должна составлять 32 бита, на меньшей цветопередаче не работает, так как это усложняет пример:

/* Компилируется строкой: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */ #include #include #include #include #include #include #include #include #include #include #include #include "bitmap.h" /* Здесь определения заголовков BMP как было описано выше в этой статье */ static XImage * CreateImageFromBuffer(Display*, unsigned char *, int , int ) ; main(int argc, char * argv ) { Display * dis; Window win; /* Наше окно */ XEvent event; /* События */ GC gc; /* Графический контекст */ XImage * image; int n, width, height, fd, size; unsigned char * data; BITMAPFILEHEADER bmp; BITMAPINFOHEADER inf; char * buf; if (argc < 2 ) { perror ("use: xtest file.bmp\n " ) ; exit (1 ) ; } if ((fd = open(argv[ 1 ] , O_RDONLY) ) == - 1 ) { printf ("Error open bitmap\n " ) ; exit (1 ) ; } read(fd, & bmp, sizeof (BITMAPFILEHEADER) ) ; read(fd, & inf, sizeof (BITMAPINFOHEADER) ) ; width = inf.biWidth ; height = inf.biHeight ; if ((dis = XOpenDisplay(getenv ("DISPLAY" ) ) ) == NULL) { printf ("Can"t connect X server: %s\n " , strerror (errno) ) ; exit (1 ) ; } win = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis) ) , 0 , 0 , width, height, 5 , BlackPixel(dis, DefaultScreen(dis) ) , WhitePixel(dis, DefaultScreen(dis) ) ) ; XSetStandardProperties(dis, win, argv[ 1 ] , argv[ 0 ] , None, argv, argc, NULL) ; gc = DefaultGC(dis, DefaultScreen(dis) ) ; /* Иногда в структуре это место не заполнено */ if (inf.biSizeImage == 0 ) { /* Вычислим размер */ size = width * 3 + width % 4 ; size = size * height; } else { size = inf.biSizeImage ; } buf = malloc (size) ; if (buf == NULL) { perror ("malloc" ) ; exit (1 ) ; } printf ("size = %d байтов выделено\n " , size) ; /* Сместимся на начало самого изображения */ lseek(fd, bmp.bfOffBits , SEEK_SET) ; /* Читаем в буфер */ n = read(fd, buf, size) ; printf ("size = %d байт прочитано\n " , n) ; image = CreateImageFromBuffer(dis, buf, width, height) ; /* Удалим буфер - он нам больше не нужен */ free (buf) ; XMapWindow(dis, win) ; XSelectInput(dis, win, ExposureMask | KeyPressMask) ; while (1 ) { XNextEvent(dis, & event) ; if (event.xany .window == win) { switch (event.type ) { case Expose: XPutImage(dis, win, gc, image, 0 , 0 , 0 , 0 , image-> width, image-> height) ; break ; case KeyPress: if (XLookupKeysym(& event.xkey , 0 ) == XK_q) { XDestroyImage(image) ; XCloseDisplay(dis) ; close(fd) ; exit (EXIT_SUCCESS) ; } break ; default : break ; } } } } /* Создает Ximage из файла BMP, так как изображение BMP хранится первернутым * и зеркальным-в цикле это исправляется */ XImage * CreateImageFromBuffer(Display * dis, unsigned char * buf, int width, int height) { int depth, screen; XImage * img = NULL; int i, j; int numBmpBytes; size_t numImgBytes; int32_t * imgBuf; int ind = 0 ; int line; int temp; int ih, iw; /* Номера строки и столбца для отражения */ int new_ind; /* Новый индекс */ screen = DefaultScreen(dis) ; depth = DefaultDepth(dis, screen) ; temp = width * 3 ; line = temp + width % 4 ; /* Длина строки с учетом выравнивания */ numImgBytes = (4 * (width * height) ) ; imgBuf = malloc (numImgBytes) ; /* Размер, отведенный на BMP в файле с учетом выравнивания */ numBmpBytes = line * height; for (i = 0 ; i < numBmpBytes; i++ ) { unsigned int r, g, b; /* Пропускаем padding */ if (i >= temp && (i % line) >= temp) continue ; b = buf[ i] ; i++; g = buf[ i] ; i++; r = buf[ i] ; /* Вычисляем новый индекс для отражения по вертикали */ iw = ind % width; ih = ind / width; new_ind = iw + (height - ih - 1 ) * width; imgBuf[ new_ind] = (r | g << 8 | b << 16 ) << 8 ; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; /* Порядок битов и байтов на PC должен быть таким */ img-> byte_order = MSBFirst; img-> bitmap_bit_order = MSBFirst; return img; }

Файлы формата bmp обычно хранят растровые изображения. Этот формат не является сжатым и используется в Windows.

Более подробно о файлах BMP

Данный формат графики называется «аппаратно независимый растр». Сам файл состоит таких частей: заголовка файла (здесь хранятся данные о ширине и высоте файла, цветовых характеристиках начальной точки, растровом идентификаторе), заголовка изображения (его может не быть), палитры (может не быть) и самой картинки.

Информация в растровых изображениях представлена в пикселях. При этом для каждого пикселя задано определенное положение и значение цвета. В файлах BMP может быть задана разная глубина цвета на один пиксель, что зависит от числа битов на пиксель (это указывается в заголовке файла). Кроме того файл bmp может содержать изображение в оттенках серого.

Чем просматривать файлы BMP

Большинство популярных программ-просмотрщиков графики без проблем смогут открыть и отобразить содержимое, хранящееся в файле BMP, поэтому проблем возникнуть не должно. Под ОС Windows можно воспользоваться встроенной утилитой «Средство просмотра фотографий Windows».

Помимо стандартных средств, открыть BMP в режиме просмотра поможет любая из следующих программ:

  1. IrfanView — программа небольшого размера для просмотра графики и видео под операционные системы Windows и ReactOS. Бесплатна для некоммерческого использования;
  2. Simply Slideshow. Бесплатная программа. С ее помощью изображения можно смотреть в режиме слайд-шоу;
  3. xnView — еще одна достойная программа для просмотра графики;
  4. ACDS Free — бесплатная версия одного из и органайзеров графических файлов. Хоть и обладает некоторыми ограничениями по сравнению с платной версией, функционала вполне достаточно для работы с BMP и рядом других графических форматов.

Какими программами открыть BMP для редактирования

Файл bmp в Windows можно открыть с помощью стандартного редактора графики. Однако подойдет почти любой графический редактор, среди них – много бесплатных. Наиболее популярны следующие:

  1. Paint.NET. Это бесплатная программа, обладающая множеством функций для корректировки фотографий и других изображений. Заявлена производителей как замена стандартной MS Paint;
  2. Gimp — популярнейший редактор растровой графики, к тому же еще и бесплатный. Рекомендуем к использованию не только для работы с BMP, но и с другими графическими форматами;
  3. PhotoScape – замечательный многофункциональный редактор для просмотра и обработки картинок и фото.

Если на вашем ПК стоит Mac OS, то воспользуйтесь такими приложениями:

  • Программа Apple Preview;
  • Adobe Fireworks для Mac;
  • Roxio Toast 11;
  • Photoshop Elements 11;

Под bmp также открывает приложение GIMP.

Как конвертировать BMP в другие форматы

С конвертацией BMP в иные популярные графические форматы проблем не будет ввиду его широкой поддержки графическими редакторами. Чтобы сохранить BMP файл в PNG или JPEG, достаточно открыть такой файл любым графическим редактором из списка выше, и воспользоваться функциями экспорта или сохранения («Сохранить как…»). В списке форматов, в который будет сохранено содержимое, выбрать нужный. Ну и, конечно, указать путь для сохранения.

Итак, формат bmp популярен, поэтому редакторов, которые его «понимают», просто множество. Стоит испробовать несколько программ, чтобы выбрать наилучшую для себя.

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

Поисковая система

Введите расширение файла

Помощь

Подсказка

Необходимо учесть, что некоторые закодированные данные из файлов, которые наш компьютер не читает, иногда можно просмотреть в Блокноте. Таким образом мы прочитаем фрагменты текста или числа - Стоит проверить, действует ли этот метод также в случае файлов BMP.

Что сделать, если приложение со списка уже было установлено?

Часто установленное приложение должно автоматически связаться с файлом BMP. Если это не произошло, то файл BMP успешно можно связать вручную с ново установленным приложением. Достаточно нажать правой кнопкой мышки на файл BMP, а затем среди доступных выбрать опцию "Выбрать программу по умолчанию". Затем необходимо выбрать опцию "Просмотреть" и отыскать избранное приложение. Введенные изменения необходимо утвердить с помощью опции "OK".

Программы, открывающие файл BMP

Windows
Mac OS

Почему я не могу открыть файл BMP?

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

Несоответственные связи файла BMP в записях реестра
- повреждение файла BMP, который мы открываем
- инфицирование файла BMP (вирусы)
- слишком маленький ресурс компьютера
- неактуальные драйверы
- устранение расширения BMP из реестра системы Windows
- незавершенная установка программы, обслуживающей расширение BMP

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

Мой компьютер не показывает расширений файлов, что сделать?

В стандартных установках системы Windows пользователь компьютера не видит расширения файлов BMP. Это успешно можно изменить в настройках. Достаточно войти в "Панель управления" и выбрать "Вид и персонализация". Затем необходимо войти в "Опции папок", и открыть "Вид". В закладке "Вид" находится опция "Укрыть расширения известных типов файлов" - необходимо выбрать эту опцию и подтвердить операцию нажатием кнопки "OK". В этот момент расширения всех файлов, в том числе BMP должны появится сортированные по названию файла.

Очень часто при работе с графикой многие пользователи сталкиваются с изображениями в формате BMP. Сегодня мало кто знает, что это такое. Сейчас мы рассмотрим графический формат BMP более подробно. Более того, мы не только отследим историю его возникновения и эволюцию, но и предложим некоторые простейшие методы его преобразования в другие популярные форматы.

Что такое BMP-формат?

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

Да, это действительно так. Изначально формат изображения BMP применялся исключительно к растровым картинкам и был универсальным (стандартным) расширением для всей графики вообще.

История возникновения

История создания этого формата неразрывно связана с корпорацией Microsoft, которая впервые реализовала его в своем главном детище - операционной системе Windows. Кроме того, несмотря на постоянную конкуренцию с Apple, поддержка графики такого типа позже была заявлена для операционки OS/2.

Правда, с тех пор BMP-формат графики претерпел множество изменений. Изначально предполагалось, что структура изображения строится на сочетании маленьких квадратиков, сегодня известных под названием пикселей. Считается, что каждый пиксель изображения может содержать данные о различной глубине цвета (количество бит на одну такую графическую единицу). Значения, используемые для указания битности цвета, выглядят как следующий ряд: 1, 2, 4, 8, 16, 24, 32, 48, 64 бита.

При этом для значений меньше 8 цвет указывается только с использованием индекса палитры (таблицы) оттенков, а для значений выше индекс берется из стандартной модели RGB. Последняя содержит вариации цветов, получаемые на основе смешивания красного, зеленого и синего.

Как уже понятно, чем выше битность, тем большим будет размер конечной картинки. Надо сказать, что формат файла BMP и в те далекие времена, и сегодня выглядит неким мастодонтом, ведь его размер достаточно большой. Связано это с тем, что само изображение является несжатым, по сравнению, допустим, с тем же форматом JPG. По размеру файлы с разными типами расширения, содержащие одно и то же изображение, могут отличаться не то что в сотни - в десятки тысяч раз.

Чем открыть формат файла BMP?

Что касается открытия изображений такого типа, любая операционка Windows имеет встроенные средства для этого.

Пока еще не были созданы приложения для просмотра, основным средством редактирования оставалась родная программа Paint, входящая в состав любой версии Windows. Тогда это приложение поддерживало исключительно BMP-формат.

Как уже понятно, с развитием технологий и эволюцией самого формата изменялась и программа. Сегодня возможности Paint намного выше, чем у начальных его версий.

Кроме того, с появлением программ для просмотра и редактирования графики формат файла BMP был заявлен в технической поддержке и в них. Неудивительно, ведь именно он явился «прадедом» практически всех известных сегодня расширений файлов изображений.

Программ для работы с такими графическими данными можно найти очень много. Среди средств просмотра, к примеру, в Windows можно использовать стандартное средство, среди сторонних приложений достаточно популярными являются программные пакеты типа ACDSee или Irfan View и многие другие.

Что касается редактирования, для работы можно применять все, что угодно, например, те же Adobe Photoshop, Corel Draw или любой другой графический редактор, имеющий даже минимальный набор инструментов и возможностей.

Простейший способ преобразования формата BMP

Теперь посмотрим, как изменить формат BMP простейшими способами. Для этого можно использовать все те же графические редакторы.

Если взять в пример стандартное приложение Paint, сначала в нем открывается искомый файл BMP, после чего из меню «Файл» выбирается команда «Сохранить как…», где в корне, в нижней строке (выпадающее меню) можно найти поддерживаемые форматы.

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

Использование конвертеров

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

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

Кстати, то же самое касается и обратного процесса, когда требуется преобразовать BMP-формат в какой-либо другой.

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

Заключение

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

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

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

Нам предстоит познакомиться с множеством различных форматов файлов: изображениями, трёхмерными моделями, аудио-файлами, видео-файлами. Начнём же с одного из самых простых графических форматов - BMP.

BMP - bitmap - битовое отображение. Понятие "отображение" взято из математики. В математике отображение стоит очень близко к понятию функции. Для простоты считайте, что слово bitmap - это картинка (хотя это и не так).

Информация о файле BMP (bmp file header)

У каждого файла bitmap есть заголовок из 14 байт. Поля этого заголовка:

2 байта. Строка BM (в Windows).
4 байта. Размер файла в байтах.

2 байта. Зарезервированное поле. Нужно инициализировать нулём.
4 байта. Адрес с которого начинается собственно изображение. Или по другому - смещение к началу изображения.

Давайте создадим изображение 100x100 пикселей. Каждый пиксель занимает 32 бита. Файловый заголовок будет выглядеть вот так:

BM
14+40+100*100*4
0
0
14+40

Важное замечание: на самом деле эти числа хранятся как последовательность байтов. Надеюсь, это понятно. Здесь (и в следующем примере) я расположил их в столбик для удобства восприятия.

Разберёмся со вторым полем. 14 - размер файлового заголовка. 40 - размер заголовка изображения (о нём ниже), 100*100 - количество пикселей. И кроме того, так как мы договорились, что каждый пиксель будет занимать 32 бита (4 байта), то нужно количество пикселей умножить на четыре.

Последнее поле: непосредственно изображение начинается сразу после файлового заголовка (14 байт) и заголовка изображения (40 байт).

Информация об изображении BMP (заголовок изображения)

Существует несколько версий BMP. Определить версию можно по размеру заголовка изображения. Мы будем пользоваться версией Windows V3, которая занимает 40 байт. Другие версии занимают 12, 64, 108, 124 байта.

В WinAPI для хранения bmp версии Windows V3 используется структура BITMAPINFOHEADER.

Поля заголовка Windows V3:

4 байта. Размер заголовка. Всегда задаётся 40 байт.
4 байта. Ширина изображения в пикселях.
4 байта. Высота изображения в пикселях.
2 байта. Данное поле всегда содержит единицу.
2 байта. Глубина цвета - количество битов в пикселе.
4 байта. Метод сжатия.
4 байта. Размер изображения. Здесь указывается размер непосредственно изображения - без учёта размера заголовков.
4 байта. Горизонтальное разрешение в пикселях на метр (количество пикселей в одном метре).
4 байта. Вертикальное разрешение в пикселях на метр (количество пикселей в одном метре).
4 байта. Количество цветов в палитре.
4 байта. Количество важных цветов в палитре.

Теперь посмотрим как будет выглядить заголовок изображения в нашем случае:

40
100
100
1
32
0
100*100*4
2795
2795
0
0

Для метода сжатия мы выбрали 0 - без сжатия. Возможны другие значения. Из интересных: BI_JPEG (значение - 4) - сжатие используемое в jpeg-изображениях и BI_PNG (значение - 5) - сжатие используемое в png-изображениях.

Горизонтальное и вертикальное разрешение мы задали равным 2795. В большинстве графических редакторов при создании изображения задаётся разрешение 71 пиксель на дюйм (ppi - pixel per inch)). Так вот, 71ppi это и есть 2795 пикселя на метр. Разрешение используется для придания изображению физической длины (для вывода на принтер например).

После заголовков расположена палитра цветов. Если её нету, то после заголовков сразу начинается изображение. Изображения с палитрами мы пока рассматривать не будем.

Данные изображения BMP

Изображение состоит из пикселей. Формат пикселей задаётся глубиной цвета (смотрите выше). В нашем примере мы использовали 32 бита на пиксель. 32-ух битный цвет обычно состоит из четырёх каналов: альфа (прозрачность), красный, зелёный, синий: ARGB (Alpha, Red, Green, Blue). Иногда альфа-канал не используется, в этом случае изображение всё равно может занимать 32 бита, просто при вычислениях не обращают внимания на значения одного канала. В этом случае названия каналов записываются так: XRGB.

Каждый канал занимает 8 бит (1 байт) и может принимать 256 значений: от нуля до 255 (от 0x00 до 0xff).

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

При 32-ухбитной глубине цвета каналы в bmp записываются так: BGRA. Именно в таком порядке: синий, зелёный, красный, альфа.

Размер строки данных в изображении bmp должнен быть кратен четырём (в байтах). Если это не так, то строка дополняется нулями. Это происходит если используется 1,2,4,8,16,24 бита на канал. Например, у нас есть изображение шириной в 3 пикселя и мы используем 16-битный цвет. Ширина строки: 16*3 = 48 (6 байт). Но длина строки должна быть кратной четырём, поэтому добавляются ещё два байта и длина строки в данном примере будет равна восьми байтам. Хотя в последних двух байтах каждой строки и не будет хранится полезной информации. Нужно учитывать условие кратности размера строки четырём при работе с не 32-ух битными изображениями.

Теперь продолжним с нашим примером и с помощью кода создадим изображение. Каждый пиксель будет инициализироваться случайным цветом:

Std::ofstream os("temp.bmp", std::ios::binary); unsigned char signature = { "B", "M" }; unsigned int fileSize = 14 + 40 + 100*100*4; unsigned int reserved = 0; unsigned int offset = 14 + 40; unsigned int headerSize = 40; unsigned int dimensions = { 100, 100 }; unsigned short colorPlanes = 1; unsigned short bpp = 32; unsigned int compression = 0; unsigned int imgSize = 100*100*4; unsigned int resolution = { 2795, 2795 }; unsigned int pltColors = 0; unsigned int impColors = 0; os.write(reinterpret_cast(signature), sizeof(signature)); os.write(reinterpret_cast(&fileSize), sizeof(fileSize)); os.write(reinterpret_cast(&reserved), sizeof(reserved)); os.write(reinterpret_cast(&offset), sizeof(offset)); os.write(reinterpret_cast(&headerSize), sizeof(headerSize)); os.write(reinterpret_cast(dimensions), sizeof(dimensions)); os.write(reinterpret_cast(&colorPlanes), sizeof(colorPlanes)); os.write(reinterpret_cast(&bpp), sizeof(bpp)); os.write(reinterpret_cast(&compression), sizeof(compression)); os.write(reinterpret_cast(&imgSize), sizeof(imgSize)); os.write(reinterpret_cast(resolution), sizeof(resolution)); os.write(reinterpret_cast(&pltColors), sizeof(pltColors)); os.write(reinterpret_cast(&impColors), sizeof(impColors)); unsigned char x,r,g,b; for (int i=0; i < dimensions; ++i) { for (int j=0; j < dimensions; ++j) { x = 0; r = rand() % 256; g = rand() % 256; b = rand() % 256; os.write(reinterpret_cast(&b),sizeof(b)); os.write(reinterpret_cast(&g),sizeof(g)); os.write(reinterpret_cast(&r),sizeof(r)); os.write(reinterpret_cast(&x),sizeof(x)); } } os.close();

В результате выполнения данного кода в папке с вашим проектом (если вы запускали программу через отладчик (F5)) или в папке Debug решения (если вы запускали исполняемый файл.exe) будет создан файл temp.bmp, который можно открыть в любом простмотрщике картинок. Изображение состоит из цветных точек.

Вверх