Разработка графического редактора

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость новой

Детальная информация о работе

Выдержка из работы

Курсовой проект

по дисциплине «Программирование»

на тему: «Разработка графического редактора»

Содержание

  • Введение
  • 1. Теоретическая часть
  • 1. 1 Анализ предметной области
  • 1. 2 Анализ требований к разрабатываемому программному обеспечению
  • 1. 3 Описание методов, применяемых в работе
  • 2. Проектная часть
  • 2. 1 Разработка общей структуры программы
  • 2. 2 Описание алгоритма работы программы
  • 2. 3 Описание разработки
    • 2.3. 1 Заставка
    • 2.3.2 Главное окно
    • 2.3.3 Новое изображение
    • 2.3.4 Рабочее состояние
    • 2.3.5 О программе
  • 3. Программная документация
  • 3. 1 Руководство программиста
  • 3. 2 Руководство пользователя
  • Заключение
  • Приложение

Введение

Представление данных на мониторе компьютера в графическом виде впервые было реализовано в середине 50-х годов для больших ЭВМ, применявшихся в научных и военных исследованиях. С тех пор графический способ отображения данных стал неотъемлемой частью подавляющего числа компьютерных систем, в особенности персональных.

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

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

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

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

1.1 Анализ предметной области

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

Растровое изображение хранится с помощью точек различного цвета (пикселей), которые образуют строки и столбцы. Любой пиксель имеет фиксированное положение и цвет. Хранение каждого пикселя требует некоторого количества бит информации, которое зависит от количества цветов в изображении.

Векторные изображения формируются из объектов (точка, линия, окружность и т. д.), которые хранятся в памяти компьютера в виде графических примитивов и описывающих их математических формул. Например, графический примитив точка задается своими координатами (X, У), линия — координатами начала (XI, Y1) и конца (Х2, Y2), окружность — координатами центра (X, У) и радиусом ®, прямоугольник — величиной сторон и координатами левого верхнего угла (XI, У1) и правого нижнего угла (Х2, У2) и т. д. Для каждого примитива назначается также цвет.

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

Векторные графические редакторы

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

Растровые графические редакторы.

Растровые графические редакторы являются наилучшим средством обработки фотографий и рисунков, поскольку растровые изображения обеспечивают высокую точность передачи градаций цветов и полутонов. Способ представления растровых изображений совершенно отличен от векторных. Растровые изображения состоят из отдельных точек, называемых растром. Такое представление изображений существует не только в цифровом виде. Растровые изображения обеспечивают максимальную реалистичность, поскольку в цифровую форму переводится каждый мельчайший фрагмент оригинала. Такие изображения сохраняются в файлах гораздо большего объёма, чем векторные, поскольку в них запоминается информация о каждом пикселе изображения. Таким образом, качество растровых изображений зависит от их размера (числа пикселей по горизонтали и вертикали) и количества цветов, которые могут принимать пиксели. Как следствие того, что они состоят из пикселей фиксированного размера, свободное масштабирование без потери качества к ним не применимо. Эта особенность, а также сама структура растровых изображений несколько затрудняет их редактирование и обработку. Но кроме создания изображений графические редакторы позволяют хранить полученные изображения. Для этого существуют файлы, которые различны для векторных и растровых графических редакторов.

1.2 Анализ требований к разрабатываемому программному обеспечению

Графический редактор должен обладать функцией обработки входных данных в следующих форматах — DIB, JPEG, PNG и GIF. В случае с анимированным gif, редактор должен обработать только первый кадр из последовательности.

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

Графический редактор должен предоставлять функционал для создания изображений выбранных размеров с последующим редактированием. Также, необходимо наличие функций масштабирования. Функции «Отменить"/"Повторить» также приветствуются.

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

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

1.3 Описание методов, применяемых в работе

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

Функция рисования включает в себя рисование точек, линий произвольной траектории, толщины и цвета, заливку одноцветных поверхностей. Эти функции в полном объеме позволяют реализовать стандартные графические средства Windows, а точнее, средства компонента GDI — Graphical Device Interface, интерфейс графических объектов Windows.

Масштабирование графического изображения осуществляется с помощью изменения свойств стандартных системных компонентов, таких как TImage или TPaintBox.

Конвертирование файлов реализуется путем открытия файла одного формата, передачи его в соответствующий компонент и сохранения его в файл, имеющий другой формат.

Работа с буфером обмена и создание графического объекта осуществляется с помощью стандартного интерфейса взаимодействия.

Операции отмены и повтора реализуются при помощи хранения в памяти всех шагов редактирования и перемещения к определенной стадии редактирования при необходимости.

1.4 Обоснование выбора средства программирования

При выборе средства программирование, главный акцент устремлялся {делался} на качество и способы реализации выбранным средством требований, предъявляемых к работе. В связи с тесной связью с GDI, наличием всех стандартных компонентов, необходимых в работе, а также простотой реализации некоторых функций, средством программирования была выбрана интегрированная среда скоростной разработки приложений Embarcadero RAD Studio Delphi XE 3.

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

Начиная с версии 7.0., среда программирования Delphi официально признана независимым языком разработки, а название среды несколько раз менялась в зависимости от компании-разработчик. Изначально, права на среду разработки принадлежали компании Borland и она носила название Borland Developer Studio. В 2006 году разработкой среды занялось отдельное подразделени Borland — CodeGear, а название среды изменилось на CodeFear RAD Studio. И, наконец, после продажи подразделения CodeGear компании Embarcadero, название интегрированной среды приняло вид «Embarcadero RAD Studio» и существует в такой форме по сей день.

2. Проектная часть

2.1 Разработка общей структуры программы

Общая структура разработки графического редактора включает в себя:

— подпрограммы инструментов

— подпрограммы масштабирования изображения

— подпрограммы копирования и вставки изображения

— подпрограммы открытия и сохранения изображения

— подпрограммы отмены и повтора графической операции

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

2.2 Описание алгоритма работы программы

Рис. 1.

2.3 Описание разработки

2.3.1 Заставка

Рис. 2.

графический редактор растровый векторный

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

2.3.2 Главное окно

Рис. 3.

Главное окно программы составлено из двух форм — собственно окна рисования и панели инструментов, прикрепленной к основному окну.

Окно для рисования содержит главное меню и полосы прокрутки.

Панель инструментов содержит собственно инструменты, палитру цветов для фона и рисования, ползунок для толщины кисти и стили карандаша. Стоит отметить, что при использовании кисти, ее стили также возможно поменять при помощи TListBox со стилями карандаша.

2.3.3 Новое изображение

Рис. 4.

Диалог для задания атрибутов нового изображения

2.3.4 Рабочее состояние

Рис. 5.

Рис. 6. Рисунок, созданный в редакторе

2.3.5 О программе

Рис. 7. Окно «О программе…»

3. Программная документация

3.1 Руководство программиста

Проект написан на языке Delphi в среде Rad Studio XE 3. Работоспособность проекта тестировалась в среде Delphi 7.0 и дала отрицательный результат вследствие устаревшей версии VCL. Теоретически, компиляция проекта возможна в среде Delphi 2010 Professional и выше.

Готовая сборка (дистрибутив) программы состоит из исполняемого файла VPhotoEditor. exe и расположенных в той же директории курсоров pen. cur, brush. cur, fill. cur.

Программа не требует установки каких-либо сторонних надстроек, кодеков и т. п.

3.2 Руководство пользователя

Для начала работы с редактором графических файлов Вам достаточно запустить исполняемый файл — VphotoViewer. exe. После запуска, программа оповестит Вас о своей загрузке отображением красочной заставки.

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

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

Чтобы приступить к работе, выберите инструмент и установите желаемые настройки инструмента.

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

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

Вы также с легкостью можете скопировать изображение в другой графический редактор, например Paint, Paint. Net иди Photoshop, а также вставить изображение из других графических редакторов. Все это Вам поможет осуществить меню Правка. Также вы можете вставит в программу скриншот экрана или окна, при помощи PrintScreen и Alt+PrintScreen соответственно.

Заключение

Разработка графического редактора объединяет в себе как творческие элементы (оформление, цветовая композиция), так и умения программирования. В представленном проекте была продемонстрирована одна из реализаций графического редактора на языке Delphi стандартными средствами Windows. На самом деле, такой подход приемлем, но лишь в ознакомительных целях, так как стандартные компоненты GDI достаточно примитивны и непригодны для реализации редакторов профессионального уровня. В последнем случае, стоит использовать возможности технологий OpenGL, Direct2D или GDI+ в крайнем случае. Все перечисленные технологии достаточно распространены и обладают мощными средствами реализации профессиональной графики. К сожалению, из-за большого количества человекочасов, необходимых для реализации графики на данных технологиях, в проекте применялась технология GDI. В то же время, имеются планы реализовать графический редактор VPhotoViewer в технологии OpenGL, расширить инструментарий, добавить фильтры и возможность подключения плагинов (дополнительных модулей). Проект является стартовой точкой работы автора с графической составляющей Windows, что объясняет особенности реализации и возможные незначительные недостатки

Приложение А

Листинг наиболее значимых модулей программы

Модуль MainUnit

unit MainUnit;

interface

uses

Winapi. Windows, Winapi. Messages, System. SysUtils, System. Variants,

System. Classes, Vcl. Graphics, gifimg, clipbrd,

Vcl. Controls, Vcl. Forms, Vcl. Dialogs, Vcl. Menus, Vcl. ExtCtrls, Jpeg, Pngimage,

Vcl. StdCtrls, Vcl. ComCtrls, Vcl. Buttons, Vcl. ImgList;

type

tTools = (Null, Pen, Brush, Fill, Ellipse);

TMainForm = class (TForm)

OpenDialog: TOpenDialog;

SaveDialog: TSaveDialog;

Image: TImage;

MainMenu: TMainMenu;

File1: TMenuItem;

Open1: TMenuItem;

N1: TMenuItem;

HalfSizeItem: TMenuItem;

NormalSizeItem: TMenuItem;

DoubleSizeItem: TMenuItem;

N2: TMenuItem;

FitToWindow: TMenuItem;

StatusBar: TStatusBar;

ImageList1: TImageList;

ScrollBox1: TScrollBox;

N3: TMenuItem;

PaintBox1: TPaintBox;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

J1: TMenuItem;

N8: TMenuItem;

Timer1: TTimer;

procedure Open1Click (Sender: TObject);

procedure N2Click (Sender: TObject);

procedure OpenImage;

procedure SaveImage;

procedure ZoomOut;

procedure ZoomIn;

procedure HalfSize;

procedure NormalSize;

procedure DoubleSize;

procedure HalfSizeItemClick (Sender: TObject);

procedure NormalSizeItemClick (Sender: TObject);

procedure DoubleSizeItemClick (Sender: TObject);

procedure Label1DblClick (Sender: TObject);

procedure ImageDblClick (Sender: TObject);

procedure N4Click (Sender: TObject);

procedure FitToWindowClick (Sender: TObject);

procedure ImageMouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormMouseWheelDown (Sender: TObject; Shift: TShiftState;

MousePos: TPoint; var Handled: Boolean);

procedure FormMouseWheelUp (Sender: TObject; Shift: TShiftState;

MousePos: TPoint; var Handled: Boolean);

procedure SpeedButton1Click (Sender: TObject);

procedure N3Click (Sender: TObject);

function ToJPEG (Source: TBitmap; Quality: TJPEGQualityRange;

isGrayScale: Boolean): TJpegImage;

procedure N5Click (Sender: TObject);

procedure N6Click (Sender: TObject);

procedure N7Click (Sender: TObject);

procedure ImageMouseDown (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure ImageMouseMove (Sender: TObject; Shift: TShiftState;

X, Y: Integer);

procedure FormCreate (Sender: TObject);

procedure ClearBuffer;

procedure J1Click (Sender: TObject);

procedure N8Click (Sender: TObject);

procedure TrimBuffer;

procedure DelOne;

procedure FormActivate (Sender: TObject);

procedure Timer1Timer (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

var

Clicked: Boolean;

OldX, OldY, StartX, StartY: Integer;

BufferPage: Integer;

OldPenMode: TPenMode;

end;

var

MainForm: TMainForm;

PosX, PosY: Integer;

CurrentExt: string;

Tool: tTools;

Buffer: array [0. 9] of TPicture;

implementation

{$R *. dfm}

uses ABOUT, SplashUnit, GraphicFileIO, ToolPanel, AttribUnit;

procedure TMainForm. Label1DblClick (Sender: TObject);

begin

OpenImage;

end;

procedure TMainForm. NormalSizeItemClick (Sender: TObject);

begin

NormalSize;

end;

procedure TMainForm. DoubleSizeItemClick (Sender: TObject);

begin

DoubleSize;

end;

procedure TMainForm. N2Click (Sender: TObject);

begin

SaveImage;

end;

procedure TMainForm. N3Click (Sender: TObject);

begin

AboutBox. ShowModal

end;

procedure TMainForm. FitToWindowClick (Sender: TObject);

begin

if Image. Align = alNone then

Image. Align := alClient

else

Image. Align := alNone;

FitToWindow. Checked := not FitToWindow. Checked;

end;

procedure TMainForm. FormActivate (Sender: TObject);

begin

with ToolsForm do

begin

top := MainForm. top;

left := MainForm. left — width — 15;

end;

end;

procedure TMainForm. FormCreate (Sender: TObject);

var

i: Integer;

begin

Tool := Null;

BufferPage := 0;

for i := 0 to Length (Buffer) do

Buffer[i] := TPicture. Create;

end;

procedure TMainForm. FormMouseWheelDown (Sender: TObject; Shift: TShiftState;

MousePos: TPoint; var Handled: Boolean);

begin // Shift = [. ]

with ScrollBox1 do

begin

if ssCtrl in Shift then

ZoomOut

else if ssAlt in Shift then

HorzScrollBar. Position := ScrollBox1. HorzScrollBar. Position + 50

else

VertScrollBar. Position := ScrollBox1. VertScrollBar. Position + 50;

end;

end;

procedure TMainForm. FormMouseWheelUp (Sender: TObject; Shift: TShiftState;

MousePos: TPoint; var Handled: Boolean);

begin

with ScrollBox1 do

begin

if ssCtrl in Shift then

ZoomIn

else if ssAlt in Shift then

HorzScrollBar. Position := ScrollBox1. HorzScrollBar. Position — 50

else

VertScrollBar. Position := ScrollBox1. VertScrollBar. Position — 50;

end;

end;

procedure TMainForm. N4Click (Sender: TObject);

var

J: TJpegImage;

B: TBitmap;

P: TPngImage;

W: TMetafile;

M: TMetafileCanvas;

G: TGIFImage;

begin

{ -=Test BMP=- }

B := TBitmap. Create;

B. Assign (Image. Picture. Graphic);

B. SaveToFile ('C:1. bmp');

{ -=Test WMF=- }

W := TMetafile. Create;

W. Assign (BMPToEMF (B));

W. SaveToFile ('C:1. wmf');

{ -=Test JPG=- }

J := TJpegImage. Create;

J. Assign (B);

J. SaveToFile ('C:1. jpg');

{ -=Test PNG=- }

P := TPngImage. Create;

P. Assign (B);

P. SaveToFile ('C:1. png');

{ -=Test GIF=- }

G := TGIFImage. Create;

G. Assign (B);

G. SaveToFile ('C:1. gif');

end;

procedure TMainForm. N5Click (Sender: TObject);

begin

Clipboard. Assign (Image. Picture);

end;

procedure TMainForm. N6Click (Sender: TObject);

begin

with Image do

begin

width := Picture. width;

Height := Picture. Height;

Picture. Assign (Clipboard);

end;

end;

procedure TMainForm. N7Click (Sender: TObject);

begin

AttribForm. ShowModal;

end;

procedure TMainForm. N8Click (Sender: TObject);

begin

if BufferPage = Length (Buffer) then

exit;

Inc (BufferPage);

Image. Picture := Buffer[BufferPage];

end;

procedure TMainForm. HalfSizeItemClick (Sender: TObject);

begin

HalfSize;

end;

procedure TMainForm. Open1Click (Sender: TObject);

var

i: Integer;

begin

ClearBuffer;

OpenImage;

for i := 0 to Length (Buffer) do

Buffer[i]. Assign (Image. Picture);

end;

procedure TMainForm. OpenImage;

var

Bmp: TBitmap;

begin

if OpenDialog. Execute then

begin

Bmp := TBitmap. Create;

Image. Picture. LoadFromFile (OpenDialog. FileName);

Bmp. Assign (Image. Picture. Graphic);

Image. Picture. Bitmap. Assign (Bmp);

Bmp. Free;

NormalSizeItem. Click;

BorderStyle := bsSizeable;

Clicked := false;

with StatusBar do

begin

Panels[0]. Text := Format ('%d x %d', [Image. Picture. width,

Image. Picture. Height]);

Panels[1]. Text := OpenDialog. FileName;

SimplePanel := false;

CurrentExt := ExtractFileExt (OpenDialog. FileName);

end;

end;

end;

procedure TMainForm. SaveImage;

var

J: TJpegImage;

B: TBitmap;

P: TPngImage;

W: TMetafile;

G: TGIFImage;

D: TGraphic;

begin

D := TGraphic. Create;

D := Image. Picture. Graphic;

with SaveDialog do

begin

if not Execute then

exit;

B := TBitmap. Create;

if CurrentExt = '. wmf' then

B. Assign (EMFtoBMP (Image. Picture. Metafile))

else

B. Assign (Image. Picture. Graphic);

case SaveDialog. FilterIndex of

1:

begin

{ -=Save to PNG=- }

DefaultExt := 'png';

P := TPngImage. Create;

P. Assign (B);

P. SaveToFile (FileName);

end;

2:

begin

{ -=Save to BMP=- }

DefaultExt := 'bmp';

B. SaveToFile (FileName);

B. Free;

end;

3:

begin

{ -=Save to JPG=- }

DefaultExt := 'jpg';

J := TJpegImage. Create;

J. Assign (B);

J. SaveToFile (FileName);

J. Free;

end;

4:

begin

{ -=Save to GIF=- }

DefaultExt := 'gif';

G := TGIFImage. Create;

G. Assign (B);

G. SaveToFile (FileName);

G. Free;

end;

5:

Begin

{ -=Save to WMF=- }

DefaultExt := 'wmf';

W := TMetafile. Create;

W. Assign (BMPToEMF (B));

W. SaveToFile (FileName);

W. Free;

End;

end;

end;

Image. Picture. Graphic := D;

end;

procedure TMainForm. SpeedButton1Click (Sender: TObject);

var

Cur: Tcursor;

Begin

Cur := LoadCursorFromFile ('1. cur');

Screen. Cursors[1] := HCursor (Cur);

ScrollBox1. Cursor := 1;

end;

procedure TMainForm. Timer1Timer (Sender: TObject);

begin

with ToolsForm do

begin

top := MainForm. top;

left := MainForm. left — width — 15;

end;

end;

function TMainForm. ToJPEG (Source: TBitmap; Quality: TJPEGQualityRange;

isGrayScale: Boolean): TJpegImage;

var

JpgImg: TJpegImage;

begin

JpgImg := TJpegImage. Create;

JpgImg. Assign (Source);

JpgImg. Grayscale := isGrayScale;

JpgImg. CompressionQuality := Quality;

JpgImg. Compress;

Result := JpgImg;

end;

procedure TMainForm. TrimBuffer;

var

i: Integer;

begin

for i := BufferPage to Length (Buffer) do

Buffer[i]. Assign (Buffer[BufferPage]);

end;

procedure TMainForm. ZoomIn;

begin

with Image do

begin

width := width + Round (Picture. width / 60);

Height := Height + Round (Picture. Height / 60);

end;

end;

procedure TMainForm. ZoomOut;

begin

with Image do

begin

width := width — Round (Picture. width / 60);

Height := Height — Round (Picture. Height / 60);

end;

end;

procedure TMainForm. ImageDblClick (Sender: TObject);

begin

Open1Click (nil);

end;

procedure TMainForm. ImageMouseDown (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

TrimBuffer;

Clicked := true;

StartX := X;

StartY := Y;

case Tool of

Fill:

MainForm. Image. Canvas. FloodFill (X, Y, MainForm. Image. Canvas. Pixels[X, Y],

fsSurface);

end;

OldX := X;

OldY := Y;

OldPenMode := Canvas. Pen. Mode;

Canvas. Pen. Mode := pmnotxor;

Canvas. Brush. Color := clWhite;

end;

procedure TMainForm. ImageMouseMove (Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

if not MainForm. Clicked then

exit;

case Tool of

Pen:

with MainForm. Image. Canvas do

begin

Pen. width := 1;

MoveTo (MainForm. StartX, MainForm. StartY);

LineTo (X, Y);

MainForm. StartX := X;

MainForm. StartY := Y;

end;

tTools (2): // Brush

with MainForm. Image. Canvas do

begin

Pen. width := ToolsForm. TrackBar1. Position;

MoveTo (MainForm. StartX, MainForm. StartY);

LineTo (X, Y);

MainForm. StartX := X;

MainForm. StartY := Y;

end;

tTools (4):

with MainForm. Image. Canvas do

begin

Pen. Mode := pmcopy;

Pen. width := ToolsForm. TrackBar1. Position;

REctangle (StartX, StartY, OldX, OldY);

REctangle (StartX, StartY, X, Y);

OldX := X;

OldY := Y;

end;

end;

end;

procedure TMainForm. ImageMouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if BufferPage = Length (Buffer) then

DelOne;

Buffer[BufferPage]. Assign (Image. Picture);

Inc (BufferPage);

Clicked := false;

end;

procedure TMainForm. J1Click (Sender: TObject);

begin

if BufferPage = 0 then

exit;

Dec (BufferPage);

Image. Picture. Assign (Buffer[BufferPage]);

end;

// Going Scals:

procedure TMainForm. HalfSize;

begin

if FitToWindow. Checked then

FitToWindow. Click;

with Image do

begin

width := Round (Picture. width / 2);

Height := Round (Picture. Height / 2);

end;

HalfSizeItem. Checked := true;

end;

procedure TMainForm. NormalSize;

begin

if FitToWindow. Checked then

FitToWindow. Click;

with Image do

begin

width := Picture. width;

Height := Picture. Height;

end;

NormalSizeItem. Checked := true;

end;

procedure TMainForm. ClearBuffer;

var

i: Integer;

begin

BufferPage := 0;

for i := 0 to Length (Buffer) do

begin

Buffer[i]. Free;

Buffer[i] := TPicture. Create;

end;

end;

procedure TMainForm. DelOne;

var

i: Integer;

begin

for i := 1 to Length (Buffer) do

Buffer[i — 1]. Assign (Buffer[i]);

BufferPage := Length (Buffer) — 1;

end;

procedure TMainForm. DoubleSize;

begin

if FitToWindow. Checked then

FitToWindow. Click;

with Image do

begin

width := Picture. width * 2;

Height := Picture. Height * 2;

end;

DoubleSizeItem. Checked := true;

end;

// End of Scaling

end.

Модуль CraphicIO

unit GraphicFileIO;

interface

uses Classes, Graphics, Jpeg, PNGimage, GIFimg;

function BMPtoEMF (Source: Tgraphic): TMetafile;

function EMFtoBMP (Source: TMetafile): TBitmap;

implementation

function EMFtoBMP (Source: TMetafile): TBitmap;

var

MetaCanvas: TMetaFileCanvas;

MetaFile: TMetafile;

Bmp: TBitmap;

begin

MetaFile := TMetafile. Create;

Bmp := TBitmap. Create;

MetaFile. Assign (Source);

Bmp. Height := MetaFile. Height;

Bmp. Width := MetaFile. Width;

Bmp. Canvas. Draw (0, 0, MetaFile);

Result := Bmp;

end;

function BMPtoEMF (Source: Tgraphic): TMetafile;

var

MetaCanvas: TMetaFileCanvas;

MetaFile: TMetafile;

begin

with MetaFile do

begin

MetaFile := TMetafile. Create;

Width := Source. Width;

Height := Source. Height;

end;

with MetaCanvas do

begin

MetaCanvas := TMetaFileCanvas. Create (MetaFile, 0);

Draw (0, 0, Source);

Free;

end;

Result := MetaFile;

end;

end.

Модуль ToolPanel

unit ToolPanel;

interface

uses

Winapi. Windows, Winapi. Messages, System. SysUtils, System. Variants,

System. Classes, Vcl. Graphics,

Vcl. Controls, Vcl. Forms, Vcl. Dialogs, Vcl. Buttons, Vcl. ExtCtrls, Vcl. ImgList,

Vcl. StdCtrls,

Vcl. Menus, Vcl. ComCtrls;

type

TToolsForm = class (TForm)

FlowPanel1: TFlowPanel;

SpeedButton1: TSpeedButton;

ImageList1: TImageList;

SpeedButton2: TSpeedButton;

Shape1: TShape;

SpeedButton3: TSpeedButton;

Shape2: TShape;

SpeedButton4: TSpeedButton;

TrackBar1: TTrackBar;

Label1: TLabel;

ColorDialog1: TColorDialog;

ListBox1: TListBox;

procedure Point (Sender: TObject; Shift: TShiftState; X, Y: Integer);

procedure FormShow (Sender: TObject);

procedure SpeedButton1Click (Sender: TObject);

procedure SpeedButton2Click (Sender: TObject);

procedure Shape1MouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Shape2MouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure SpeedButton3Click (Sender: TObject);

procedure SpeedButton4Click (Sender: TObject);

procedure TrackBar1Change (Sender: TObject);

procedure LoadCursor (Name: String);

procedure SpeedButton5Click (Sender: TObject);

procedure ListBox1DrawItem (Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

procedure ListBox1Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

ToolsForm: TToolsForm;

implementation

{$R *. dfm}

uses MainUnit;

procedure TToolsForm. FormShow (Sender: TObject);

var

I: Integer;

begin

for I := 0 to 3 do

ImageList1. GetBitmap (I,

TSpeedButton (FindComponent ('SpeedButton' + IntTostr (I + 1))). Glyph);

end;

procedure TToolsForm. ListBox1Click (Sender: TObject);

begin

MainForm. Image. Canvas. Pen. Style := TPenStyle (ListBox1. ItemIndex);

MainForm. Image. Canvas. Brush. Style := TBrushStyle (ListBox1. ItemIndex);

end;

procedure TToolsForm. ListBox1DrawItem (Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

var

X, Y: Integer;

begin

with ListBox1. Canvas do

begin

X := Rect. Left;

Y := Rect. Top;

Pen. Style := TPenStyle (Index);

MoveTo (X, Y);

LineTO (X + 100, Y);

Font. Color := clBlue;

TextOut (Rect. Left + 110, Rect. Top, IntTostr (Index));

end;

end;

procedure TToolsForm. LoadCursor (Name: String);

var

h: THandle;

begin

h := LoadImage (0, PWIdeChar (Name + '. cur'), IMAGE_CURSOR, 0, 0,

LR_LOADFROMFILE);

if h = 0 then

ShowMessage ('Cursor not loaded')

else

begin

Screen. Cursors[1] := h;

MainForm. Image. Cursor := 1;

end;

end;

procedure TToolsForm. Point (Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

exit;

end;

procedure TToolsForm. Shape1MouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

with ColorDialog1 do

if Execute then

begin

MainForm. Image. Canvas. Pen. Color := Color;

Shape1. Brush. Color := Color;

end;

end;

procedure TToolsForm. Shape2MouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

with ColorDialog1 do

if Execute then

begin

MainForm. Image. Canvas. Brush. Color := Color;

Shape2. Brush. Color := Color;

end;

end;

procedure TToolsForm. SpeedButton1Click (Sender: TObject);

begin

MainUnit. Tool := Pen;

LoadCursor ('Pen');

end;

procedure TToolsForm. SpeedButton2Click (Sender: TObject);

begin

MainUnit. Tool := Null;

MainForm. Image. Cursor := crDefault;

end;

procedure TToolsForm. SpeedButton3Click (Sender: TObject);

begin

MainUnit. Tool := Fill;

LoadCursor ('Fill');

end;

procedure TToolsForm. SpeedButton4Click (Sender: TObject);

begin

MainUnit. Tool := tTools (2);

LoadCursor ('Brush');

end;

procedure TToolsForm. SpeedButton5Click (Sender: TObject);

begin

MainUnit. Tool := ellipse;

end;

procedure TToolsForm. TrackBar1Change (Sender: TObject);

begin

Label1. Caption := IntTostr (TrackBar1. Position)

end;

end.

Показать Свернуть
Заполнить форму текущей работой