Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа.docx
Скачиваний:
36
Добавлен:
01.09.2021
Размер:
1.57 Mб
Скачать

Палитровые изображения

Если 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;

}

}

Соседние файлы в предмете Технология программирования