![](/user_photo/_userpic.png)
Палитровые изображения
Если
BITMAPINFOHEADER.BitCount = 1,4 или 8, то после заголовков
файла и изображения следует палитра
размером
цветов, которая представляет собой
массив структур RGBTRIPLE или RGBQUAD. Чаще
используется RGBQUAD, поэтому хранение
палитры в RGBTRIPLE не рассматривается.
Для того чтобы хранить палитру изображения внутри класса Image, необходимо создать указатель Palette.
После палитры 1,4,8-битных изображений следует не массив структур RGBTRIPLE или RGBQUAD, а индексы цветов в палитре, каждый из которых занимает BitCount бит. При считывании из файла данных палитрового изображения в массив данных **Rgbquad записывается цвет палитры, на который указывает индекс. Соответственно, при записи данных в файл происходит преобразование цвета из RGBQUAD в индекс этого цвета в палитре.
Описание структуры класса Image
Абстрактный базовый класс, который предоставляет функциональные возможности для производных классов Bitmap и Metafile. Данный класс является абстрактным классом. Если нужно только загружать и выводить растровые изображения, класс Image содержит все необходимое для этого.
Описание функций
Image::Image (char Mode, unsigned short BCount, int Width, int Height) – конструктор создаёт изображение с заданной глубиной цвета, шириной и высотой. В качестве параметра принимает глубину цвета, высоту и ширину изображения. На основе этих параметров заполняется поля структуры заголовка изображения и выделяется память для массива данных изображения.
Image::Image(char Mode, unsigned short BCount, int Width, int Height)
{
// Выставление начальных параметров, соответствующих пустому изображению
setEmptyImageParams();
if (COUNTBIT(BCount))
{
SETHEADER(Width, Height, BCount); // заполняем заголовок изображения и выделяем память
if (Palette)
{
Mode = Palette[getNearestPaletteColorIndex(Mode)].Red; // получаем ближайший к переданному цвет в палитре, если она используется
}
// Заполнение данных изображения переданным значением
for (int i = 0; i < (int)BMInfoHeader.Height; i++){
for (int j = 0; j < (int)BMInfoHeader.Width; j++)
{
Rgbtriple[i * BMInfoHeader.Width + j].Red = Mode;
Rgbtriple[i * BMInfoHeader.Width + j].Green = Mode;
Rgbtriple[i * BMInfoHeader.Width + j].Blue = Mode;
}
}
}
Image::Image (char *fileName) – конструктор, который считывает изображение из файла. В качестве параметра принимает имя файла.
Image::Image(char* fileName)
{
setEmptyImageParams(); // Заполняем параметры пустого изображения
loadimage(fileName); // выполняем загрузку из файла с переданным именем
}
Image::Image() – конструктор, который создаёт пустой контейнер под изображение. Все поля заголовка изображения равны NULL, память под массив данных изображения не выделяется.
Image::Image()
{
setEmptyImageParams(); // Заполняем параметры пустого изображения
}
Image::Image (const Image &im) - Конструктор копии. Отдельно выделяет для копии память под массив, после чего копирует в него массив объекта, копия которого создаётся, а также копирует его заголовок изображения. В качестве параметра принимает адрес объекта, чья копия создаётся.
Image::Image(const Image& im)
{
INITIMAGE(im); // делаем копию изображения
}
Image& Image::operator = (const Image& Inp) – перегрузка оператора =, присваивает левому объекту правый в том случаи, если левый объект – пустой контейнер, либо параметры Width и Height левого и правого объекта совпадают. Перегрузка оператора принимает в качестве параметра правый объект, возвращает левый объект.
Image& Image::operator = (const Image& Inp) // Перегрузка оператора =
{
if (Rgbtriple) // если изображение уже создано
{
copyDataIMAGE(Inp); // то пробуем только скопировать данные (при совпадении форматов)
}
else
{
INITIMAGE(Inp); // иначе создаем копию
}
return *this;
}
void Image::writeimage (const char *fileName) - метод загружает заголовок изображения и массив из объекта в файл. Если объект - пустой контейнер, функция завершается. В качестве параметра принимает имя файла, в которое будет загружено изображение.
void Image::writeimage(char* fileName) // выполняет запись в файл
{
FILE* f;
f = fopen(fileName, "w+b"); // необходимо открывать бинарный файл
saveImageTF(f); // сохраняет данные в файл
fclose(f);
}
int Image::loadimage (const char *fileName) - метод считывает изображение из файла в объект. В случаи, если у объекта и файла одинаковые параметры Width и Height, просто считывается массив из файла в объект. Иначе массив объекта пересоздаётся и его размеры будут соответствовать параметрам Width и Height файла. Так же в обоих случаях в объект считывается заголовок изображения из файла. В качестве параметра принимается имя файла.
int Image::loadimage(char* fileName)
{
FILE* f;
// открываем требуемый файл
f = fopen(fileName, "rb"); // необходимо открывать бинарный файл
// производим загрузку данных
int resultCode = loadImageFF(f);
// закрываем файл
fclose(f);
return resultCode;
}
Image operator /= (Image InpImage) – перегрузка оператора /=. Изменяет размер изображение правого объекта, делая его равным размеру изображения левого объекта, при этом результат запишется в левый объект. Перегрузка оператора принимает в качестве параметра правый объект, возвращает левый.
Image& Image::operator /= (const Image& Inp) // Перегрузка оператора /=, выполняет запись переданного изображения в текущее с изменением размера
{
float xRatio = (float)Inp.BMInfoHeader.Width / BMInfoHeader.Width; // вычисление соотношения ширины изображений
float yRatio = (float)Inp.BMInfoHeader.Height / BMInfoHeader.Height; // вычисление соотношения высоты изображений
for (int i = 0; i < BMInfoHeader.Height; i++)
{
for (int j = 0; j < BMInfoHeader.Width; j++)
{
int sourceX = (int)(j * xRatio); // вычисление x координаты в исходном изображении
int sourceY = (int)(i * yRatio); // вычисление y координаты в исходном изображении
Rgbtriple[i * BMInfoHeader.Width + j] = Inp.Rgbtriple[sourceY * Inp.BMInfoHeader.Width + sourceX]; // запись значения цвета из исходного изображения в текущее
}
}
return *this;
}
Image Image:: operator / (short Depth) - перегрузка оператора. Уменьшает глубину цвета левого объекта. Глубина цвета становится равной значению, стоящему слева от оператора. В качестве параметра принимает значение новой глубины цвета, возвращает объект с изменённой глубиной цвета.
Image Image::operator / (short Depth) // Перегрузка оператора
{
Image result(0, Depth, BMInfoHeader.Width, BMInfoHeader.Height); // создаем пустое изображение
result.copyAndConvertDataFromImage(*this); // выполняем преобразование текущего изображения в итоговое
return result;
}
Image:: ~ Image() – деструктор. Удаляет динамический массив.
Image::~Image()
{
if (Rgbtriple) // Если есть указатель на данные, то нужно очистить выделенную под изображение память
{
/* for (int i = 0; i < BMInfoHeader.Height; i++) // Проходим по всем строкам изображения
{
delete[] Rgbtriple[i]; // и удаляем выделенную под строку память
}*/
delete[] Rgbtriple; // Удаляем память, содержащую массив указателей на строки
Rgbtriple = NULL; // Инициализируем указатель на данные невалидным значением
// (не обязательно, так как пороисходит в деструкторе)
}
if (Palette) // Удаление палитры, если она была создана
{
delete[] Palette;
Palette = NULL;
}
}