- •Компьютерная графика
- •Лабораторная работа №1 Графические примитивы
- •Задание
- •Последовательность выполнения задания
- •Программный код
- •1.2.1 Среда программирования Microsoft Visual Studio 6. (мастер приложений AppWizard)
- •1.2.2 Среда разработки ms Visual Studio 2010
- •1. Добавим строки, сохраняющие координаты указателя мыши в момент нажатия левой кнопки мыши
- •2. Добавим в метод OnDraw() класса cPainterView строки, которые будут выполнять вывод на экран линий, соединяющих опорные точки.
- •3. Создание нового рисунка. Добавим в метод OnNewDocument() класса cPainterDoc
- •4. Сохранение рисунков в файл. Модифицируем функцию Serialize() класса cPainterDoc в файле PainterDoc.Cpp
- •Лабораторная работа №2 Фракталы
- •Лабораторная работа №3
- •Сплайны. Кривая Безье
- •Задание
- •Последовательность выполнения задания
- •Программный код
- •Лабораторная работа №4
- •Цель работы:
- •Теоретическое введение:
- •Лабораторная работа №5 «Закрашивание. Метод Фонга»
- •Контрольная работа
Лабораторная работа №4
«Загрузка и вывод изображения в формате GIF, вывод полупрозрачного текста с графикой»
Цель работы:
Научиться работать с изображениями формата GIF,вывод полупрозрачного текста с графикой.
Теоретическое введение:
Вывод изображений с использованием GDI+
GDI+ можно использовать для вывода изображений, которые существуют в приложении в качестве файлов. Это осуществляется путем создания объекта класса Image (например объекта Bitmap), создания объекта Graphics, который ссылается на поверхность рисования, и вызова метода DrawImage объекта Graphics. Изображение будет выведено на поверхность рисования, предоставленную графическим классом. С помощью редактора изображений можно создавать и редактировать файлы изображений в режиме разработки и отображать их с использованием GDI+ в режиме выполнения.
Вывод изображения с помощью GDI+ (рис. 48)
Создайте объект, представляющий изображение для вывода. Этот объект должен быть членом класса, наследуемого от Image, например Bitmap или Metafile. Ниже приведен пример.
// Uses the System.Environment.GetFolderPath to get the path to the
// current user's MyPictures folder.
Bitmap myBitmap = new Bitmap
(System.Environment.GetFolderPath
(System.Environment.SpecialFolder.MyPictures));
Создайте объект Graphics, представляющий поверхность рисования для использования.
// Creates a Graphics object that represents the drawing surface of
// Button1.
Graphics g = Button1.CreateGraphics();
Вызовите метод DrawImage графического объекта, чтобы вывести изображение. Следует указать изображение и координаты для его отображения.
g.DrawImage(myBitmap, 1, 1);
Форматы графических файлов
GIF (Graphics Interchange Format)
Изображения в формате GIF часто размещаются на веб-страницах. Файлы GIF хорошо подходят для хранения изображений, образованных линиями, рисунков со сплошными блоками одного цвета и рисунков с четкой границей между различными цветами. Файлы GIF подвергаются сжатию, но сжатие происходит без потерь. Восстановленное после сжатия изображение полностью совпадает с исходным изображением. Один цвет в изображении формата GIF можно сделать прозрачным, так что через изображение в качестве фона будет проглядывать веб-страница, на которой размещено это изображение. Последовательность изображений GIF можно сохранять в одном файле, что позволяет создавать анимированные изображения GIF. Изображения формата GIF могут содержать не более 8 бит на точку, поэтому в таких изображениях можно использовать не более 256 цветов.
JPEG (Joint Photographic Experts Group)
JPEG — это схема сжатия, хорошо работающая для естественных образов, таких как отсканированные фотографии. Некоторые данные теряются в процессе сжатия, но обычно потеря остается незаметной для человеческого глаза. Изображения JPEG содержат 24 бита данных для каждой точки, поэтому на таких рисунках можно передать более 16 миллионов цветов. JPEG не поддерживает прозрачность или анимацию.
Степень сжатия изображений с помощью схемы JPEG можно настраивать, но большая степень сжатия (позволяющая получать меньшие файлы) приводит к росту потерь данных. Коэффициент сжатия 20:1 обычно позволяет получить изображение, которое человеческий глаз с трудом может отличить от оригинала. На приведенном ниже рисунке представлено изображение в формате BMP и два изображения JPEG, полученные в результате сжатия изображения в формате BMP. Первый рисунок JPEG получен с использованием коэффициента сжатия 4:1, а второй получен с использованием коэффициента сжатия 8:1. Используемый в схеме JPEG алгоритм сжатия плохо подходит для сжатия изображений, образованных линиями, сплошных блоков одного цвета и изображений с четкими границами между цветами. На приведенном ниже рисунке показано изображение в формате BMP, два изображения JPEG и одно изображение в формате GIF. Изображения JPEG и GIF были получены путем сжатия изображения в формате BMP. Для формата GIF и для меньшего изображения JPEG был задан коэффициент 4:1, а для большего изображения JPEG был задан коэффициент сжатия 8:3. Обратите внимание, что изображение в формате GIF сохраняет четкие границы вдоль линий, а на изображениях JPEG эти границы размываются. JPEG является схемой сжатия, а не файловым форматом. JPEG File Interchange Format (JFIF) — это файловый формат, обычно используемый для хранения и передачи изображений, сжатых по схеме JPEG. Файлы формата JFIF, отображаемые веб-обозревателями, обычно имеют расширение JPG.
PNG (Portable Network Graphics)
Формат PNG сохраняет многие преимущества формата GIF, но также предоставляет многие возможности, недоступные в GIF. Как и в формате GIF, файлы PNG сжимаются без потери данных. Файлы PNG могут содержать цвета, задаваемые 8, 24 или 48 битами каждый, и оттенки серого, задаваемые 1, 2, 4, 8 или 16 битами на точку. В файлах GIF цвет одной точки можно задавать только 1, 2, 4 или 8 битами. В файлах PNG можно также задавать альфа-фактор для каждой точки, который определяет степень слияния цвета точки с цветом фона.
В формате PNG расширена реализованная в формате GIF возможность прогрессивно отображать изображение, что позволяет выводить на экран все более и более подробное приближение изображения по мере поступления его частей через сетевое соединение. Файлы PNG могут содержать данные о гамма-коррекции и о цветовой коррекции, что позволяет правильно строить изображение на различных устройствах отображения.
Код программы:
// Обработчик рисования
void OnPaint(HDC hdc, RECT& rc)
{
Graphics g(hdc);
Rect paintRect(0, 0, rc.right, rc.bottom);
Bitmap backBuffer(rc.right, rc.bottom, &g);
Graphics temp(&backBuffer);
PaintBackground(temp, paintRect);
PaintSocket(temp, paintRect);
PaintPterodactyl(temp, paintRect);
g.DrawImage(&backBuffer, 0, 0, 0, 0, rc.right, rc.bottom, UnitPixel);
// i++;
}
//Рисование фона
void PaintBackground(Graphics& g, Rect& rc)
{
WCHAR text[]=L"Демонстрация работы \n"
L"с прозрачными \n"
L"и анимированными \n"
L"файлами формата GIF.";
#ifdef DRAW_COMPLEX_BACKGROUND
g.DrawImage(GIF2, 0,0, GIF2->GetWidth()+90, GIF2->GetHeight());
#else
g.Clear(Color(255, 200, 200, 200));
#endif
// g.DrawImage(GIF2, 0,0, GIF2->GetWidth()+90, GIF2->GetHeight());
#ifdef DRAW_TEXT_BACKGROUND
g.DrawString(text, -1, font,
PointF(float(rc.Width/2), float(rc.Height/2)),
stringFormat, textBrush);
#endif
}
//Рисование футболиста
void PaintPterodactyl(Graphics& g, Rect& rc)
{
else
{
if(SocketPos.X-PterodactylPos.X>0) PterodactylPos.X+=5;
else PterodactylPos.X-=5;
if(SocketPos.Y-PterodactylPos.Y>0) PterodactylPos.Y+=5;
else PterodactylPos.Y-=5;
PterodactylImage->SelectActiveFrame(&FrameDimensionTime, activeFrame);
g.SetInterpolationMode(InterpolationModeHighQualityBicubic);
g.DrawImage(PterodactylImage, PterodactylPos.X-15, PterodactylPos.Y-40,
PterodactylImage->GetWidth(), PterodactylImage->GetHeight());
activeFrame=(activeFrame+1)%frameCount;
}
}
//Рисование мяча
void PaintSocket(Graphics& g, Rect& rc)
{
if(!SocketImage)
{
g.DrawString(L"Socket image load error", -1, font,
PointF(float(rc.Width/2), float(rc.Height-20)),
stringFormat, textBrush);
}
else
{
g.DrawImage(SocketImage, SocketPos.X, SocketPos.Y,
SocketImage->GetWidth(), SocketImage->GetHeight());
}
}
Работа программы:
Рис.48 Результат работы программы
