Задать вопрос
@Muriam

Как разобраться, что происходит в этом заголовочном файле?

Тема проекта - работа с bmp-изображениями.
https://ru.wikipedia.org/wiki/BMP

С++ builder. В заголовочном файле bmp.h объявляются: структуры, класс (а может это конструктор?) и функции. Пожалуйста объясните, как это все работает, новичку.

Как этот заголовочный файл был подключен к проекту, просто #include "bmp.h" или через меню с++builder-a?

#include <io.h>
#include <stdio.h>
#pragma pack(1)

struct FileHeader 
{
	WORD 	bfType; 
	DWORD   bfSize;
	WORD	bfReserved1;    //не используется
	WORD	bfReserved2;    //не используется
	DWORD   bfOffbits;      //смещение данных битового образа от заголовка в байтах 
};

struct MAPINFO 
{
	DWORD   Size;           //число байт, занимаемых структурой InfoHeader
	DWORD   Width;          //ширина битового образа в пикселях
	DWORD   Height;         //высота битового образа в пикселях 
	WORD    Planes;         //число битовых плоскостей устройства
	WORD    BitCount;       //число битов на пиксель
	DWORD   Compression;    //тип сжатия
	DWORD   SizeImage;      //размер картинки в байтах
	long    XPelsPerMeter;  //горизонтальное разрешение устройства, пиксель/м
	long    YPelPerMeter;   //вертикальное разрешение устройства, пиксель/м
	DWORD   ClrUsed;        //число используемых цветов
	DWORD   ClrImportant;   //число "важных" цветов
};

struct RGBquad 
{
    BYTE    rgbBlue;         //интенсивность голубого
    BYTE    rgbGreen;        //интенсивность зеленого
    BYTE    rgbRed;          //интенсивность красного    
    BYTE    rgbReserved;     //не используется
};

class CBmp
{
private:
	void *pBmp;
	long SizeFile;
public:
	CBmp();
	~CBmp();
	void Open(char* fn);
	void Save(char* fn);
	FileHeader *GetFH();
	MAPINFO *GetMapInfo();
	RGBquad *GetMap();
};

void CBmp::Save(char* fn)
{
        FILE* File;
        File=fopen(fn,"wb");
        fwrite(pBmp,1,SizeFile,File);
        fclose(File);
}

RGBquad *CBmp::GetMap()
{
	RGBquad *rgb;
	rgb=(RGBquad *)((long)pBmp+sizeof(FileHeader)+sizeof(MAPINFO));
	return rgb;
}

MAPINFO *CBmp::GetMapInfo()
{
	MAPINFO *mi;
	mi=(MAPINFO*)((long)pBmp+sizeof(FileHeader));
	return mi;
}

FileHeader *CBmp::GetFH()
{
	FileHeader *fh;
	fh=(FileHeader *)pBmp;
	return  fh;
}

CBmp::CBmp()
{
	pBmp=0;
	SizeFile=0;
}

CBmp::~CBmp()
{
	delete [] pBmp;
}

void CBmp::Open(char* fn)
{
	FILE* File;
        int hFile;
        File=fopen(fn,"rb");
        hFile=_fileno(File);
        SizeFile=filelength(hFile);
        pBmp=(BYTE*)malloc(SizeFile);
        fread(pBmp,1,SizeFile,File);
        fclose(File);
}


УТОЧНЕНИЕ:
я хочу понять код, который выше, чтобы сделать таким же образом структуру
из вопроса: Как создать заголовочный файл?

в моем проекте мне нужно обвести рамкой, толщиной 15 пикселей bmp изображение. Рамка состоит из пикселей случайных цветов Работа с графикой. С++ builder. Как нарисовать рамку вокруг рисунка?
  • Вопрос задан
  • 532 просмотра
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Учи понятие «единица компиляции». Тут, к сожалению, есть и вещи, которые должны быть в CPP-файле, и вещи, которые должны быть в H-файле.

#pragma pack(1)
Структуры данных нам нужны «один в один», без байтов заполнения.

struct FileHeader 
struct MAPINFO

Формат BMP. Не забывай, что формат BMP записывается с нижней строки!

Функция Open читает картинку «один в один», Save пишет «один в один», GetMapInfo и GetFH выдают какие-то заголовки нашего BMP.

Остаётся GetMap(), который, по идее, должен выдавать матрицу цветов, но реально действует только для 32-битного BMP и никак не инкапсулирует ни ширину-высоту матрицы, ни тот факт, что формат BMP пишется с нижней строки.

За этот код — тройка с минусом.

А теперь чего ваш код НЕ поддерживает, но, по идее, должен, чтобы выполнить вашу задачу.
1. Создание BMP нужного размера с нуля, а не загрузка из файла.
2. Инкапсулировать матрицу пикселей. Желательно так, чтобы был быстрый доступ к строкам как к буферам в памяти, для простоты переноса информации из старого BMP в новый, на 30×30 пикселей больший.
3. Если вы ограниченно поддерживаете формат BMP — вылетать с ошибкой, если версия неподдерживаемая (например, не то количество цветов).

Задача именно своими силами наладить поддержку BMP? А то в Builder’е есть TBitmap.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы