Замена всех цветов на оттенки одного цвета

Автор работы: Пользователь скрыл имя, 22 Мая 2013 в 18:29, курсовая работа

Краткое описание

Исходные данные:
Создать полностью завершённое приложение в DELPHI, которое позволяет заменить оттенки всех цветов изображения на выбранный оттенок одного цвета.
В приложение добавить необходимые визуальные компоненты - окно, кнопки, панели.

Содержание

1. Теоретическая часть. 4
1.1 Растровая графика, общие сведения. 4
1.2 Цветовая модель RGB 5
1.3 Формат BMP 5
2. Порядок выполнения работы 7
3. Результаты выполнения работы 12
4. Используемая литература 15

Вложенные файлы: 1 файл

Курсовая работа КГ моя.docx

— 1.72 Мб (Скачать файл)

Министерство  образования и науки РФ

 

ИРКУТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет кибернетики

Кафедра вычислительной техники

 

 

 

 

 

                                            

 

 

 

 

«Замена всех цветов на оттенки одного цвета»

 

пояснительная записка 
к курсовой работе по дисциплине

 

«Компьютерная графика»

 

 

 

 

 

 

 

                                                                         Выполнил: студент гр. АСУз-08

                                                                                Петров М.А.

 

                                                                       Проверил: доцент кафедры АС 

                                                                                 Григорьев С.В.

 

 

 

 

Курсовая работа защищена с оценкой ___________  __________________

Дата  защиты _____________________

 

 

 

Иркутск 2012г.

 

Министерство  образования и науки РФ

 

ИРКУТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет кибернетики

Кафедра вычислительной техники

 

 

 

 

ЗАДАНИЕ

НА КУРСОВУЮ РАБОТУ

По  курсу     Компьютерная графика     

 

 

 

Тема  проекта: Замена всех цветов на оттенки одного цвета.

 

 

Исходные  данные:

 

Создать полностью завершённое приложение в DELPHI, которое позволяет заменить оттенки всех цветов изображения на выбранный оттенок одного цвета.

В приложение добавить необходимые визуальные компоненты - окно, кнопки, панели.

 

 

 

 

 

 

 

 

 

 

 

 

Графическая часть на ______________ листах.

Дата  выдачи задания “______” __________________________2012 г.

Дата  представления проекта руководителю “______” ___________2012 г.

Руководитель  курсового проектирования (курсовой работы) Григорьев С.В.

 

 

Иркутск 2012г.

 

Оглавление

1. Теоретическая часть. 4

1.1 Растровая графика, общие сведения. 4

1.2 Цветовая модель RGB 5

1.3 Формат BMP 5

2. Порядок выполнения работы 7

3. Результаты выполнения работы 12

4. Используемая литература 15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    1. Теоретическая часть.

1.1 Растровая графика, общие сведения.

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

Основой растрового представления графики является пиксель (точка) с указанием ее цвета. При описании, например, красного эллипса  на белом фоне необходимо указать  цвет каждой точки эллипса и фона. Изображение представляется в виде большого количества точек – чем их больше, тем визуально качественнее изображение и больше размер файла. Т.е. одна и даже картинка может быть представлена с лучшим или худшим качеством в соответствии с количеством точек на единицу длины – разрешением (обычно, точек на дюйм – dpi или пикселей на дюйм – ppi).

Растровые изображения напоминают лист клетчатой бумаги, на котором  любая клетка закрашена либо черным, либо белым цветом, образуя в совокупности рисунок. Пиксел – основной элемент растровых изображений. Именно из таких элементов состоит растровое изображение, т.е. растровая графика описывает изображения с использованием цветных точек (пиксели), расположенных на сетке.

При редактировании растровой графики Вы редактируете пиксели, а не линии.

Цвет любого пиксела растрового изображения запоминается  с помощью комбинации битов. Чем больше битов для этого используется, тем больше оттенков цветов можно получить. Под градацию яркости обычно отводится 1 байт (256 градаций), причем 0 – черный цвет, а 255 – белый (максимальная интенсивность). В случае цветного изображения отводится по байту на градации яркостей всех трех цветов. Возможно кодирование градаций яркости другим количеством битов (4 или 12), но человеческий глаз способен различать только 8 бит градаций на каждый цвет, хотя специальная аппаратура может потребовать и более точную передачу цветов. Цвета, описываемые 24 битами, обеспечивают более 16 миллионов доступных цветов и их часто называют естественными цветами.

1.2 Цветовая модель RGB

Цветовая  модель RGB была изначально разработана  для описания цвета на цветном  мониторе, но поскольку мониторы разных моделей и производителей различаются, были предложены несколько альтернативных цветовых моделей, соответствующих  «усредненному» монитору. К таким  относятся, например, sRGB и Adobe RGB.

В компьютерах для представления каждой из координат традиционно используется один октет, значения которого обозначаются для удобства целыми числами от 0 до 255 включительно.

1.3 Формат BMP

С форматом 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-файл  состоит из четырёх частей:

  1. Заголовок файла (BITMAPFILEHEADER)
  2. Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Палитра (может отсутствовать)
  4. Само изображение

 

 

    1. Порядок выполнения работы

Главная форма программы:

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(OpenDialog1.FileName);

      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.Bitmap, Panel1.Color);

    Image1.Refresh;

  end else

    Application.MessageBox(

      'Сначала нужно загрузить картинку',

      'Ошибка');

end;

 

// Вызывается при нажатии  на кнопку "Сохранить"

procedure TForm1.Button4Click(Sender: TObject);

begin

  // Проверяем, что картинка  загружена

  if imageSet then begin

    // Запускаем диалог  сохранения и в случае, если  нажато Ок..

    if SaveDialog1.Execute then

      // Сохраняем  картинку в выбранный файл

      Image1.Picture.SaveToFile(SaveDialog1.FileName);

  end else

    // Если не загружена - показываем сообщение об этом

    Application.MessageBox(

      'Сначала  нужно загрузить картинку',

      'Ошибка');

end;

 

// Вызывает при загрузке  формы

procedure TForm1.FormCreate(Sender: TObject);

begin

  // Устанавливаем флаг  того, что картинка еще не загружена

  imageSet := false;

end;

end.

 

    1. Результаты выполнения работы

Основное окно программы:

Диалог открытия файла

 


 

Файл загружен в форму:

 


Диалог выбора цвета:

 

Преобразованный растр:

 


Обработчик  ошибки выбора неправильного формата  растрового изображения:

 

    1. Используемая литература

  1. «Компьютерная графика» Учебное пособие для вузов. (информатика в техническом университете) Божко А., Жук Д.М., Маничев В.Б. Издательство МГТУ им. Баумана 2007.
  2. Компьютерная графика М. Н. Петров, В. Молочков. Издательство Питер 2002.
  3. http://render.ru.
  4. http://gamedev.ru.

 




Информация о работе Замена всех цветов на оттенки одного цвета