Обслуживание множества объектов класса — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Обслуживание множества объектов класса

2021-12-07 29
Обслуживание множества объектов класса 0.00 из 5.00 0 оценок
Заказать работу

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

Однако чаще класс предназначен для описания множества однородных объектов: тех же гистологических срезов или томографических проекций, медицинских карт или историй болезней пациентов, анкет сотрудников предприятия и т. д. Как в этих случаях осуществляется обработка объектов?

Рассмотрим в качестве примера класс Image, описывающий набор полученных с помощью микроскопа и телекамеры увеличенных изображений медицинских препаратов – мазков крови группы пациентов. Пусть эти изображения хранятся не в формате битовых матриц, содержащем, кроме собственно изображения, еще и дополнительную управляющую информацию, а в виде однородных числовых массивов, заполненных кодами цветов последовательных точек изображения. Такой формат упрощает математическую обработку данных, хотя и несколько усложняет их вывод на экран. В случае 24-битовых цветных изображений каждый цветной пиксель будет описываться в файле тройкой байтов, содержащих интенсивности красного, зеленого и синего компонентов цвета данной точки экрана (рис. 5.1).

Рис. 5.1. Структура числового файла с цветным изображением

Для обращения к файлу с данными удобнее всего воспользоваться методом отображения файла на память, для чего в составе класса следует предусмотреть указатель на проекцию файла в памяти. Индексируя этот указатель, программа сможет прочитать любой байт файла.

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

Для сравнения изображений препаратов друг с другом и визуального анализа результатов их обработки желательно выводить на экран сразу группу изображений (разумеется, в программе могут быть предусмотрены также и средства их вывода по отдельности в увеличенном масштабе). Этот общий кадр можно сформировать в большом глобальном блоке памяти (размером в окно приложения), который, после переноса в него отдельных изображений в требуемом порядке, будет копироваться в окно приложения.


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

Такой класс имеет минимальные функциональные возможности и его разумно использовать в качестве базового в программном комплексе, обеспечивающем обработку изображений:

class Image{

protected:

BYTE* ptr;// Указатель на проекцию файла в памяти

HBITMAP hBmp;// Совместимая память для хранения изображения

HDCP hdcMem;// Совместимый контекст этой памяти

char* name;// Имя файла с данными

int nmb;// Номер загруженного изображения

public:

Image(int nmb,char* name);// Конструктор класса

void View();// Функция вывода изображения

};

В открытую секцию класса включены объявления конструктора класса и функции View (), формирующей изображение конкретного объекта.

В программе объявляется массив из требуемого числа указателей на объекты типа Image:

Image* pImg[5];

Далее в цикле из 5 шагов создаются объекты класса Image; конструктору класса передаются в качестве аргументов номер изображения и имя содержащего его файла (предполагается, что в программе имеется массив char * names [] имен этих файлов):

for(int i=0;i<5;i++)

Img[i]=new Image(i,names[i]);

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

Функция View (), входящая в состав класса Image, выводит цветное изображение, хранящееся в объекте, в совместимую память объекта и копирует затем эту память в соответствующее место совместимой памяти окна (в данном примере изображения препаратов имеют размер 100 ´ 100 пикселей):

void Image::View(){

for(int i=0;i<100;i++){// Цикл по столбцам изображения

for(int j=0;j<300;j+=3){// Цикл по строкам изображения

  BYTE byte0=ptr[i*300+j];// Получим красный компонент

  BYTE byte1=ptr[i*300+j+1];// Получим зеленый компонент

  BYTE byte2=ptr[i*300+j+2];// Получм синий компонент

// Выведем цветную точку в совместимую память объекта

  SetPixel(hdcMem,j/3,i,RGB(byte0,byte1,byte2));

  }

}

// Скопируем память объекта в память кадра

BitBlt(hdcBigMem,5+nmb*105,5,100,100,hdcMem,0,0,SRCCOPY);

SetBkMode(hdcBigMem,TRANSPARENT);// Прозрачный фон символов

// Выведем под изображением имя файла

TextOut(hdcBigMem,5+nmb*105,108,name,strlen(name));

}

Нетрудно далее организовать (например, посредством меню) вызов функции View () в цикле для всех объектов Image:

for(int i=0;i<5;i++){// Цикл по всем объектам

pImg[i]->View();// Вызов View () для каждого объекта

}

}

Результат работы программы показан на рис. 5.2 (в действительности на экран выводятся цветные изображения).

Рис. 5.2. Исходные изображения 5 препаратов

Рассмотрим теперь случай, когда от базового класса Image образован производный класс с именем, например, Image Gray, предназначенный для обработки изображений препаратов, имеющих лишь несколько градаций серого цвета. Такие “упрощенные” исходные данные могут быть полезны при отладке программ цифровой обработки изображений. Заметим кстати, что файл с цветными изображениями при нашем методе кодирования будет содержать 30000 байтов (100 ´ 100 пикселей по три байта на пиксель), а файл с серым изображением будет в три раза короче, так как каждый пиксель будет описываться одним байтом.

Включим в класс конструктор и замещающую функцию View():

ImageGray:public Image{

public:

ImageGray (int n,cahr* f):Image(n,f){}

void View();

};

Новая функция View () будет отличаться от аналогичной функции базового класса алгоритмом заполнения совместимой памяти объекта; кроме того, она будет копировать блоки памяти объектов в память кадра на 130 пикселей ниже, чтобы можно было одновременно наблюдать изображения обоих классов:

void ImageGray::View(){

for(int i=0;i<100;i++){// Цикл по столбцам изображения

for(int j=0;j<100;j++){// Цикл по строкам изображения

  BYTE byte=ptr[i*100+j];// Получим значение серого

// Выведем точку серого цвета в совместимую память объекта

  SetPixel(hdcMem,j,i,RGB(byte,byte,byte));

  }

}

// Скопируем память объекта в память кадра

BitBlt(hdcBigMem,5+nmb*105,5+130,100,100, hdcMem,

    0,0,SRCCOPY);

SetBkMode(hdcBigMem,TRANSPARENT);// Прозрачный фон символов

// Выведем под изображениями имена файлов

TextOut(hdcBigMem,5+nmb*105,108+130,name,strlen(name)); 

}

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

Image* pImg[5];

ImageGray* pImgGray[5];

после чего создать все 10 объектов:

for(int i=0;i<5;i++)

pImg[i] = new Image(i,names[i]);

for(int i=0;i<5;i++)

pImgGray[i] = new ImageGray(i,namesGray[i]);

Очевидно, что любые циклические действия с массивами изображений придется осуществлять отдельно для массивов двух классов:

for(int i=0;i<5;i++)

pImg[i]->View();

for(int i=0;i<5;i++)

pImgGray[i]->View();

Результат выполнения этих двух циклов приведен на рис. 5.3.

Рис. 5.3. Исходные полноцветные изображения и полученные из них изображения с несколькими градациями серого цвета

Если производных классов несколько, как это часто бывает на практике, то для каждого класса придется предусматривать отдельный цикл. Использование виртуальных функций, как это будет показано в следующем подразделе, позволяет обрабатывать объекты базового и производных классов в одном цикле, если обращаться к ним с помощью указателя на базовый класс.


Поделиться с друзьями:

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.024 с.