Автор работы: Пользователь скрыл имя, 22 Мая 2013 в 18:29, курсовая работа
Исходные данные:
Создать полностью завершённое приложение в DELPHI, которое позволяет заменить оттенки всех цветов изображения на выбранный оттенок одного цвета.
В приложение добавить необходимые визуальные компоненты - окно, кнопки, панели.
1. Теоретическая часть. 4
1.1 Растровая графика, общие сведения. 4
1.2 Цветовая модель RGB 5
1.3 Формат BMP 5
2. Порядок выполнения работы 7
3. Результаты выполнения работы 12
4. Используемая литература 15
Министерство образования и науки РФ
ИРКУТСКИЙ
ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
Факультет кибернетики
Кафедра вычислительной техники
«Замена всех цветов на оттенки одного цвета»
пояснительная записка
к курсовой работе по дисциплине
«Компьютерная графика»
Курсовая работа защищена с оценкой ___________ __________________
Дата защиты _____________________
Иркутск 2012г.
Министерство образования и науки РФ
ИРКУТСКИЙ
ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
Факультет кибернетики
Кафедра вычислительной техники
ЗАДАНИЕ
НА КУРСОВУЮ РАБОТУ
По курсу Компьютерная графика
Тема проекта: Замена всех цветов на оттенки одного цвета.
Исходные данные:
Создать
полностью завершённое
В приложение добавить необходимые визуальные компоненты - окно, кнопки, панели.
Графическая часть на ______________ листах.
Дата выдачи задания “______” __________________________2012 г.
Дата
представления проекта
Руководитель курсового проектирования (курсовой работы) Григорьев С.В.
Иркутск 2012г.
Оглавление
1. Теоретическая часть. 4
1.1 Растровая графика, общие
1.2 Цветовая модель RGB 5
1.3 Формат BMP 5
2. Порядок выполнения работы 7
3. Результаты выполнения работы 12
4. Используемая литература 15
Компьютерное растровое
Основой растрового представления графики является пиксель (точка) с указанием ее цвета. При описании, например, красного эллипса на белом фоне необходимо указать цвет каждой точки эллипса и фона. Изображение представляется в виде большого количества точек – чем их больше, тем визуально качественнее изображение и больше размер файла. Т.е. одна и даже картинка может быть представлена с лучшим или худшим качеством в соответствии с количеством точек на единицу длины – разрешением (обычно, точек на дюйм – dpi или пикселей на дюйм – ppi).
Растровые изображения напоминают лист клетчатой бумаги, на котором любая клетка закрашена либо черным, либо белым цветом, образуя в совокупности рисунок. Пиксел – основной элемент растровых изображений. Именно из таких элементов состоит растровое изображение, т.е. растровая графика описывает изображения с использованием цветных точек (пиксели), расположенных на сетке.
При редактировании растровой графики Вы редактируете пиксели, а не линии.
Цвет любого пиксела растрового изображения запоминается с помощью комбинации битов. Чем больше битов для этого используется, тем больше оттенков цветов можно получить. Под градацию яркости обычно отводится 1 байт (256 градаций), причем 0 – черный цвет, а 255 – белый (максимальная интенсивность). В случае цветного изображения отводится по байту на градации яркостей всех трех цветов. Возможно кодирование градаций яркости другим количеством битов (4 или 12), но человеческий глаз способен различать только 8 бит градаций на каждый цвет, хотя специальная аппаратура может потребовать и более точную передачу цветов. Цвета, описываемые 24 битами, обеспечивают более 16 миллионов доступных цветов и их часто называют естественными цветами.
Цветовая модель RGB была изначально разработана для описания цвета на цветном мониторе, но поскольку мониторы разных моделей и производителей различаются, были предложены несколько альтернативных цветовых моделей, соответствующих «усредненному» монитору. К таким относятся, например, sRGB и Adobe RGB.
В компьютерах для представления каждой из координат традиционно используется один октет, значения которого обозначаются для удобства целыми числами от 0 до 255 включительно.
С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы Windows и OS/2. Файлы формата BMP могут иметь расширения .bmp, .dib и .rle.
Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксель, но глубина 2 бита на пиксель официально не поддерживается. При этом для глубины цвета меньше 16 бит используется палитра с полноцветными компонентами глубиной 24 бита.
В формате BMP изображения могут храниться как есть или же с применением некоторых распространённых алгоритмов сжатия. В частности, формат BMP поддерживает RLE-сжатие без потери качества, а современные операционные системы и программное обеспечение позволяют использовать JPEG и PNG (эти форматы встраиваются в BMP как в контейнер).
BMP-файл состоит из четырёх частей:
Главная форма программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs;
type
TForm1 = class(TForm)
// Компонент, в котором будем отображать картинку
Image1: TImage;
// Кнопка "Открыть файл"
Button1: TButton;
// Диалог открытия файла
OpenDialog1: TOpenDialog;
// Кнопка выбора цвета
Button2: TButton;
// Диалог выбора цвета
ColorDialog1: TColorDialog;
// Панель, в оттенки цвета фона которой мы будем преобразовывать картинку
Panel1: TPanel;
// Кнопка "Преобразовать"
Button3: TButton;
// Кнопка "Сохранить файл"
Button4: TButton;
// Диалог сохранения файла
SaveDialog1: TSaveDialog;
// Хэндлеры на нажатия кнопок
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
флаг, символизирующий, что картинка загружена
imageSet: Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// процедура преобразования цвета (из файла)
procedure ModColors(Bitmap: TBitmap; Color: TColor);
Cледующие три функции извлекают значение отдельного канала из записи цвета TColor - это целое число со знаком, длиной 4 байта, первый байт (вместе со знаковым битом) - служебный, мы его игнорируем, работаем только с последними тремя байтами: 0хBBGGRR (последовательность обратная из за особенности хранения чисел, занимающих больше байта - little-endian), где самый старший из трех байт обозначает синий канал, следующий - зеленый, а самый младший - красный. Извлечение происходит с помощью функции Lo(), которая возвращает младший байт числа. Соответственно, для того чтобы получить второй и третий байты, мы сдвигаем число на 8 и 16 бит соответственно с помощью shr().
//извлечение красного
function GetR(const Color: TColor): Byte;
begin
Result := Lo(Color);
end;
//извлечение зеленого
function GetG(const Color: TColor): Byte;
begin
Result := Lo(Color shr 8);
end;
//извлечение синего
function GetB(const Color: TColor): Byte;
begin
Result := Lo((Color shr 8) shr 8);
end;
Нормализация числа в пределах [0..255] - если число больше или меньше границ, оно приравнивается к ближайшей границе диапазона.
function BLimit(B: Integer): Byte;
begin
if B < 0 then
Result := 0
else if B > 255 then
Result := 255
else
Result := B;
end;
type
// объявляем тип записи для хранения точки картинки
TRGB = record
B, G, R: Byte;
end;
// и объявляем тип указателя на эту запись
pRGB = ^TRGB;
var
// объявляем переменные
// временное хранение каналов
r1, g1, b1: Byte;
// текущие координаты
x, y: Integer;
// в этой переменной будем хранить указатель на элемент строки точек -
// одной линии изображения, перемещаться по ней будем с помощью арифметики
// указателей
Dest: pRGB;
// коэффициент
A: Double;
begin
// Удостоверяемся, что формат рисунка - 24 бита
Bitmap.PixelFormat := pf24Bit;
Рассчитываем коэффициенты насыщенности для каналов цвета, в оттенки которого мы будем преобразовывать картинку:
r1 := Round(255 / 100 * GetR(Color));
g1 := Round(255 / 100 * GetG(Color));
b1 := Round(255 / 100 * GetB(Color));
// Перебираем построчно все изображение
for y := 0 to Bitmap.Height - 1 do
begin
// Помещаем в Dest указатель на первую точку строки точек
Dest := Bitmap.ScanLine[y];
// Перебираем все точки в строке
for x := 0 to Bitmap.Width - 1 do
begin
// Используем with для сокращения записи
with Dest^ do
begin
Вычисляем общий коэффициент насыщенности исходного пикселя в изображении
A := (r + b + g) / 300;
with Dest^ do
begin
Присваиваем новые значения каналам цвета картинки
R := BLimit(Round(r1 * A));
G := BLimit(Round(g1 * A));
B := BLimit(Round(b1 * A));
end;
end;
// Устанавливаем указатель на следующую точку строки
Inc(Dest);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
try
// Загружаем файл в элемент Image1, который у нас на форме
Image1.Picture.LoadFromFile(
Form1.Constraints.MinWidth := Image1.Picture.Width + 178;
Устанавливаем внутренний флаг, что картинка успешно загружена, чтобы преобразователь цветов не пытался преобразовывать ничего, если картинка еще не загружена:
ImageSet := true;
except
Application.MessageBox(
'Не могу загрузить картинку. Поддерживается только формат BMP',
'Ошибка');
end;
end;
end;
// Вызывается при нажатии на кнопку выбора цвета
procedure TForm1.Button2Click(Sender: TObject);
begin
Запускает стандартный диалог выбора цвета и устанавливает его в качестве фона панельки рядом с кнопкой
if ColorDialog1.Execute then
Panel1.Color := ColorDialog1.Color;
end;
// Вызывается при нажатии на кнопку "Преобразовать"
procedure TForm1.Button3Click(Sender: TObject);
begin
// Если картинка загружена
- запускаем преобразование
if imageSet then begin
В качестве цвета, в оттенки которого преобразуется картинка, используется цвет загруженный в панель:
ModColors(Image1.Picture.
Image1.Refresh;
end else
Application.MessageBox(
'Сначала нужно загрузить картинку',
'Ошибка');
end;
// Вызывается при нажатии на кнопку "Сохранить"
procedure TForm1.Button4Click(Sender: TObject);
begin
// Проверяем, что картинка загружена
if imageSet then begin
// Запускаем диалог сохранения и в случае, если нажато Ок..
if SaveDialog1.Execute then
// Сохраняем картинку в выбранный файл
Image1.Picture.SaveToFile(
end else
// Если не загружена - показываем сообщение об этом
Application.MessageBox(
'Сначала нужно загрузить картинку',
'Ошибка');
end;
// Вызывает при загрузке формы
procedure TForm1.FormCreate(Sender: TObject);
begin
// Устанавливаем флаг того, что картинка еще не загружена
imageSet := false;
end;
end.
Основное окно программы:
Диалог открытия файла
Файл загружен в форму:
Диалог выбора цвета:
Преобразованный растр:
Обработчик ошибки выбора неправильного формата растрового изображения:
Информация о работе Замена всех цветов на оттенки одного цвета