![](/user_photo/_userpic.png)
Часть 2. Реализация простых методов обработки изображений и палитровые изображения.
Реализовать перегрузку оператора Image operator /= (Image InpImage), осуществляющего масштабирование изображений.
Добавить в методы возможность считывания, создания и записи палитровых изображений. Дополняются все методы кроме конструктора без параметров Image (). Глубина цвета выбирается в зависимости от варианта задания.
Реализовать перегрузку оператора Image operator / (short Depth), осуществляющего изменение глубины цвета.
Для варианта 5:
Одномерный массив
RGBTRIPLE
4 и 8 бит
Описание структуры bmp файла Части bmp-файла
BMP-файлы состоят из следующих частей:
- Заголовок файла (структура BITMAPFILEHEADER). Содержит информацию о типе, размере и макете файла, который содержит изображение.
- Заголовок изображения (структура BITMAPINFOHEADER). Содержит информацию об изображении аппаратно-независимого растрового формата.
- Данные изображения (Массив структур RGBTRIPLE или RGBQUAD). В файле данные пикселей изображения хранятся построчно, начиная с нижней строки.
Сначала мы создаем структуру заголовка BMP – файла: struct BITMAPFILEHEADER
{
unsigned short Type;
unsigned long Size; // Размер файла в байтах, BitCount*Height*Width+ OffsetBits
unsigned short Reserved1; // Зарезервирован; должен быть нуль
unsigned short Reserved2; // Зарезервирован; должен быть нуль
unsigned long OffsetBits; // Смещение данных от начала файла в байтах
};
После этого мы создаем структуру информации BMP – файла:
struct BITMAPINFOHEADER
{
unsigned long Size; // Число байтов необходимое для структуры = 40
unsigned long Width; // Ширина точечного рисунка в пикселях
unsigned long Height; // Высота точечного рисунка в пикселях
unsigned short Planes; // Число плоскостей целевого устройства = 1
unsigned short BitCount; // Глубина цвета, число бит на точку = 0,1,4,8,16,24,32
unsigned long Compression; // Тип сжатия = 0 для несжатого изображения
unsigned long SizeImage; // Размер изображения в байтах BitCount*Height*Width
unsigned long XPelsPerMeter; // Разрешающая способность по горизонтали
unsigned long YPelsPerMeter; // Разрешающая способность по вертикали
unsigned long ColorUsed; // Число индексов используемых цветов. Если все цвета = 0
unsigned long ColorImportant; // Число необходимых цветов = 0
};
А затем, создаем палитры RGBTRIPLE и RGBQUAD
struct RGBTRIPLE
{
unsigned char Blue;
unsigned char Green;
unsigned char Red;};
struct RGBQUAD
{
unsigned char Blue;
unsigned char Green;
unsigned char Red;
unsigned char Reserved;
};
Масштабирование
Для масштабирования изображений необходимо добавить оператор в список методов класса:
Image operator /= (Image InpImage);
Метод использует следующий подход: цвет пикселя в масштабированном изображении принимается равным цвету ближайшего к нему пикселя исходного изображения.
Масштабирования изображения происходит следующим образом:
- Для начала вычисляются отношения высоты и ширины текущего изображения к исходному.
- Затем вычисляются каждые координаты x и y исходного изображения.
- После чего записывается значение цвета исходного изображения в текущее.