Как создать файл bmp
Перейти к содержимому

Как создать файл bmp

  • автор:

Работа с файлами в формате BMP

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

Структура данных файла в формате BMP имеет следующий вид:

BITMAPFILEHEADER
BITMAPINFOHEADER
RGBQUAD array
Color-index array

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

typedef struct tagBITMAPFILEHEADER
<
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
> BITMAPFILEHEADER, *PBITMAPFILEHEADER;

bfType Тип файла. Должен быть «BM». bfSize Размер файла в байтах. bfReserved1, bfReserved2 Зарезервированные поля. bfOffBits Смещение битового массива относительно начала файла.

Далее следует структура информационного заголовка ( BITMAPINFOHEADER ), имеющая следующий вид:

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 Размер структуры. biWidth , biHeight Ширина и высота изображения в пикселах соответственно. biPlanes Количество плоскостей. Использовалось ранее при небольшой глубине фвета. Сейчас, при числе цветов 256 и больше, оно всегда равно 1. Сохранено для совместимости. biBitCount Глубина цвета в битах на пиксель. biCompression Тип сжатия. Если компрессия не используется, то флаг имеет значенине BI_RGB . Возможны варианты BI_RLE8 , BI_RLE4 , BI_BITFIELDS и BI_JPEG . biSizeImage Размер изображения в байтах. Если изображение не сжато (то есть поле biCompression установлено в BI_RGB), то здесь может быть записан 0. biXPelsPerMeter , biYPelsPerMeter Горизонтальное и вертикальное разрешение (в пикселях на метр) соответственно. Важно в первую очередь для устройства, на которое будет выводиться битовый массив. biClrUsed Количество используемых цветов кодовой таблицы. Если значение поля равно 0, то используется максимально возможное количество цветов, которые разрешены значением поля biBitCount . biClrImportant Количество основных цветов. Определяет число цветов, необходимых для отображения изображения. Если значение поля равно 0, то используются все цвета.

За информационным заголовком следует таблица цветов, представляющая собой массив структур RGBQUAD (4-байтовых полей). Каждое поле соответствует своему цвету в палитре, а три байта из четырех – синей, зеленой и красной компонентам этого цвета. Последний байт каждого поля зарезервирован и должен быть равен 0.

После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Длина каждой строки выровнена на границу в 4 байта (при длине строки, некратной четырем, она дополняется нулями).

Теперь рассмотрим пример реализации чтения графических файлов в формате BMP приложением, построенным на основе MFC с использованием библиотеки IPL:

// Чтение файла в формате BMP
BITMAPINFOHEADER* ipLoad( const char * fname)
if(!fname)
return NULL;

BITMAPINFOHEADER* infohdr = NULL;
ifstream fsrc;

try
BITMAPFILEHEADER filehdr;
BITMAPINFOHEADER bmphdr;

fsrc.open(fname, ios::in | ios::binary);
if (fsrc.fail())
throw runtime_error(«Ошибка чтения графического файла»);

fsrc.read(( char *)&filehdr, sizeof (BITMAPFILEHEADER) );
if (fsrc.fail())
throw runtime_error(«Ошибка чтения заголовка файла BMP»);

if (filehdr.bfType != 0x4d42)
throw runtime_error(«Неверный тип исходного файла»);

fsrc.read(( char *)&bmphdr, sizeof (BITMAPINFOHEADER));
if (fsrc.fail())
throw runtime_error(«Ошибка чтения информационного заголовка файла BMP»);

if (bmphdr.biSize != 0x28)
throw runtime_error(«Неверный тип исходного файла»);

int colorbytes = filehdr.bfOffBits — sizeof (BITMAPFILEHEADER) — sizeof (BITMAPINFOHEADER);

int totalbytes = filehdr.bfSize — sizeof (BITMAPFILEHEADER);

infohdr = (BITMAPINFOHEADER*) new unsigned char [totalbytes];
if (!infohdr)
throw runtime_error(«Ошибка выделения памяти для размещения изображения»);

memcpy(infohdr, &bmphdr, sizeof (bmphdr) );

char * quads = ( char *)infohdr + sizeof (BITMAPINFOHEADER);

char * pixels = ( char *)quads + colorbytes;

fsrc.read(( char *)quads, colorbytes);

fsrc.read(( char *)pixels, totalbytes — colorbytes — sizeof (BITMAPINFOHEADER));

fsrc.close();
>
catch(runtime_error e)
TRACE0(e.what());
if(infohdr)
<
free( infohdr );
infohdr = 0;
>
> return infohdr;
>
// Чтение и размещение изображения
void CTestDoc::Serialize(CArchive& ar)
if (ar.IsStoring())
>
else

if (m_img != NULL)
iplDeallocate(m_img, IPL_IMAGE_ALL);
>

BITMAPINFOHEADER* bmphdr = ipLoad(ar.GetFile()->GetFilePath());

if (bmphdr)

m_img = iplCreateImageHeader(3, 0, IPL_DEPTH_8U,
IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL,
bmphdr->biHeight, NULL, NULL, NULL,

iplConvertFromDIB(bmphdr, m_img);

UpdateAllViews(NULL);
>
else
TRACE0(«Ошибка при чтении файла BMP»);
>
>
>

Как создать файл bmp

Формат файлов растрового изображения Windows (BMP) был создан как стандартный графический формат для представления графики в виде растровых изображений в операционной системе Windows.

Импорт файла растрового изображения

1 Выберите пункт Файл Импорт .

2 Выберите папку, в которой хранится файл.

3 Выберите BMP – растровое изображение Windows (*.bmp; *.dib; *.rle) в списке рядом с полем Имя файла .

4 Щелкните имя файла.
5 Выберите пункт Импорт .

Экспорт файла растрового изображения

1 Выберите пункт Файл Экспорт .

2 Выберите папку, в которой необходимо сохранить файл.
3 Выберите вариант BMP — растровое изображение Windows в списке Тип файла .
4 Введите имя файла в поле Сохранить как .
5 Нажмите кнопку Экспорт .

6 В диалоговом окне Преобразование в растровое изображение настройте ширину, высоту, разрешение, цветовой режим или любой другой параметр.

Технические замечания по формату растрового изображения Windows (BMP)

Импорт файла BMP

• Можно импортировать файлы растровых изображений Windows, соответствующие техническим требованиям Windows и OS/2 BMP.

• Файлы растровых изображений Windows могут быть представлены в следующих цветовых режимах: черно-белый , 16 цветов, оттенки серого , на основе палитры или RGB (24 бита). Они печатаются в соответствии с цветовым режимом, в зависимости от возможностей принтера.

• Сжимать путем продольного кодирования (RLE) можно все растровые изображения, за исключением изображений в цветовой палитре RGB (24 бита) и черно-белых изображений.

• Разрешение может варьироваться в диапазоне от 72 до 300 точек на дюйм . При настройке дополнительных параметров можно получить более высокое разрешение.

• Максимальный размер изображения — 64 535 × 64 535 пикселей .

Экспорт файла BMP

• Поскольку растровые изображения отображаются на странице попиксельно , разрешение не увеличивается. Напротив, растровое изображение получается неровным, и его разрешение существенно уменьшается.

Функции, указанные в справке, доступны в полной версии CorelDRAW Graphics Suite 2021. Некоторые функции могут быть недоступны в этой версии продукта.

Создать программно bmp файл

Смотрел решение данной проблемы на msdn и тут : C++ How to create a bitmap file Создает файл с расширением .bmp но при этом в описании ничего нету, файл пишет что поврежден. заголовок читал, смотрел, вроде то. пытался скопировать из bmp в bmp, если полностью скопировать bmpFileHeader и bmpInfoHeader то работает. Также пробовал делать еще некоторые манипуляции, перевернуть отразить. Похоже что я что то не так делаю с заголовками

BITMAPFILEHEADER bmpFileHeader = < 0 >; BITMAPINFOHEADER bmpInfoHeader = < 0 >; RGBQUAD RGBcolor; for (size_t i = 0; i < height*width; ++i) image[i].reserved = 0; bmpFileHeader.bfType = 0x4d42; bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfoHeader.biWidth = width; bmpInfoHeader.biHeight = height; bmpInfoHeader.biSizeImage = (DWORD)(bmpInfoHeader.biWidth * bmpInfoHeader.biHeight); bmpInfoHeader.biPlanes = 1; bmpInfoHeader.biBitCount = 8; bmpInfoHeader.biCompression = BI_RGB; bmpInfoHeader.biXPelsPerMeter = bmpInfoHeader.biYPelsPerMeter = 2000; bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+bmpInfoHeader.biSize + bmpInfoHeader.biSizeImage; bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + bmpInfoHeader.biSize + sizeof(RGBQUAD); for (size_t i = 0; i < height * width; ++i)< fwrite(&image[i], sizeof(RGBQUAD), 1, output); >typedef struct RGB< BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; BYTE reserved; >; 

Отслеживать
Peter Lavreniuk
задан 24 апр 2016 в 7:26
Peter Lavreniuk Peter Lavreniuk
2,941 7 7 золотых знаков 28 28 серебряных знаков 57 57 бронзовых знаков
Сравнить с рабочим BMP пробовали?
24 апр 2016 в 7:48

@ВладимирМартьянов пробовал. изменил biBitCount на 16 и что то пишет, но цвета искажает сильно и пишет один цвет в 3 пикселя .

24 апр 2016 в 8:06

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

bmpFileHeader.bfSize — поле заполнено неверно, должно быть: bmpFileHeader.bfSize = sizeof(BITMAPINFOHEADER);

bmpFileHeader.bfOffBits — здесь вы оставляете место под 256 записей палитры — непонятно зачем, потому что очевидно палитра вам тут не нужна и вы её точто не заполняете, а сразу пишете пиксели.

Также обратите внимание, что изображение в bmp — перевёрнутое, т.е. нижняя строка пикселов идёт первой, затем та что над ней итд.

Вообще, нужно внимательно читать описание каждого поля. По вашему коду видно, что многое вы упустили. Вот описание структуры на русском: http://www.vsokovikov.narod.ru/New_MSDN_API/Bitmaps/str_bitmapinfoheader.htm

В качестве примера работающего кода могу дать свой: https://github.com/nzeemin/ukncbtl/blob/master/util/BitmapFile.cpp — функция BmpFile_SaveScreenshot() в самом начале файла.

Проверьте поле biBitCount — сейчас у вас оно показывает что цвет 8-битный, а заливаете вы 32-битные пиксели.

Создайте файл BMP в Java.

Высокоскоростная библиотека Java для создания файла BMP. Это профессиональное программное решение для импорта и экспорта XLSX, PDF и многих других форматов с использованием Java.

Aspose.Cells for Java
Overview
Download from NuGet

Open NuGet package manager, search for and install.
You may also use the following command from the Package Manager Console.

Visit our documentation for more details.

Создайте файл BMP, используя Java.

Как создать файл BMP? С помощью библиотеки Aspose.Cells for Java вы можете легко создать файл BMP программно с помощью нескольких строк кода. Aspose.Cells for Java способен создавать кроссплатформенные приложения с возможностью генерировать, изменять, конвертировать, отображать и распечатывать все файлы Excel. Java Excel API не только конвертирует форматы электронных таблиц, но также может отображать файлы Excel в виде изображений, PDF, HTML, ODS, CSV, SVG, JSON, WORD, PPT и т. д., что делает его идеальным выбором для обмена документами в стандартных отраслевых форматах. Вы можете скачать его последнюю версию прямо с Maven и установите его в свой проект на основе Maven, добавив следующие конфигурации в pom.xml.

Репозиторий

  AsposeJavaAPI Aspose Java API https://repository.aspose.com/repo/  

Зависимость

  com.aspose aspose-cells version of aspose-cells API jdk17  

Как создать BMP в Java

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

  1. Создайте экземпляр Класс рабочей тетради .
  2. Получите доступ к соответствующему листу с помощью метода getWorksheets.get().
  3. Выберите соответствующую ячейку, введите значение в нужную ячейку, используя имя ячейки, например A1, B3 и т. д.
  4. Сохраните книгу в формате BMP, используя метод save().

Пример кода показывает, как создать файл BMP в Java.

 // Create a new workbook Workbook wkb = new Workbook();  // Access the first worksheet of the workbook. Worksheet worksheet = wkb.getWorksheets().get(0);  // Add relevant content in the cell worksheet.getCells().get("A1").putValue("ColumnA"); worksheet.getCells().get("B1").putValue("ColumnB") worksheet.getCells().get("A2").putValue("ValueA") worksheet.getCells().get("B2").putValue("ValueB")  // Save the workbook as BMP file wkb.save("Excel.bmp");  // To enhance the code for further functionalities here are more functions // getCells() and setValue for modifying the cell content // getCharts().add() to add charts // getPivotTables().add() for creating a Pivot Table // getCells().get(int cell id).setFormula for adding cell level formula 

Библиотека Java для создания файла BMP

Мы размещаем наши пакеты Java в Maven репозитории. «Aspose.Cells for Java» — это обычный файл JAR, содержащий байт-код. Пожалуйста, следуйте пошаговые инструкции о том, как установить его в среду разработки Java.

Системные Требования

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

  • Microsoft Windows или совместимая ОС с Java Среда выполнения для приложений JSP/JSF и настольных приложений.
  • Aspose.Cells for Java поддерживает следующие версии Java: J2SE 6.0 (1.6), J2SE 7.0 (1.7) или выше.
  • Получите последнюю версию Aspose.Cells for Java непосредственно с телефона Maven.

BMP Формат файла BMP

Файлы с расширением .BMP представляют собой файлы растровых изображений, которые используются для хранения растровых цифровых изображений. Эти изображения не зависят от графического адаптера и также называются форматом файлов растрового изображения, независимого от устройства (DIB). Эта независимость служит цели открытия файла на нескольких платформах, таких как Microsoft, Windows и Mac. Формат файла BMP может хранить данные в виде двумерных цифровых изображений как в монохромном, так и в цветном формате с различной глубиной цвета.

Другое поддерживаемое создание электронных таблиц

Вы также можете создавать другие форматы Excel Microsoft, включая несколько перечисленных ниже.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *