Формат Bmp-файла

Характеристика формата Bmp-файла: ширина и высота изображения, количество плоскостей, глубина цвета и компрессия, и его структура. Двумерные матричные преобразования. Среда разработки: Delphi 7 как быстрый и с большими возможностями язык программирования.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 23.04.2014
Размер файла 400,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

1. Постановка задачи

2. Теоретическое введение

3. Среды разработки

3.1 Алгоритм

4. Описание программы

4.1 Требования к системе

4.2 Руководство пользователю

4.3 Описание процедур программы

4.4 Описание переменных

5. Листинг программы

1. Постановка задачи

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

2. Теоретическое введение

Формат Bmp-файла

По решению разработчиков формат Bmp-файла не привязан к конкретной аппаратной платформе. Этот файл состоит из четырех частей: заголовка, информационного заголовка, таблицы цветов (палитры) и данных изображения. Если в файле хранится изображение с глубиной цвета 24 бита (16 млн. цветов), то таблица цветов может отсутствовать, однако в нашем, 256-цветном случае она есть. Структура каждой из частей файла, хранящего 256-цветное изображение, дана в таблице

Заголовок файла начинается с сигнатуры «BM», а затем идет длина файла, выраженная в байтах. Следующие 4 байта зарезервированы для дальнейших расширений формата, а заканчивается этот заголовок смещением от начала файла до записанных в нем данных изображения. При 256 цветах это смещение составляет 1078 -- именно столько и пришлось пропустить в нашей прошлой программе, чтобы добраться до данных.

Информационный заголовок начинается с собственной длины (она может изменяться, но для 256-цветного файла составляет 40 байт) и содержит размеры изображения, разрешение, характеристики представления цвета и другие параметры.

Ширина и высота изображения задаются в точках растра и пояснений, пожалуй, не требуют.

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

Глубина цвета считается важнейшей характеристикой способа представления цвета в файле и измеряется в битах на точку. В данном случае она равна 8.

Компрессия. В Bmp-файлах обычно не используется, но поле в заголовке для нее предусмотрено. Обычно она равна 0, и это означает, что изображение не сжато. В дальнейшем будем использовать только такие файлы.

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

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

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

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

За информационным заголовком следует таблица цветов, представляющая собой массив из 256 (по числу цветов) 4-байтовых полей. Каждое поле соответствует своему цвету в палитре, а три байта из четырех -- компонентам синей, зеленой и красной составляющих для этого цвета. Последний, самый старший байт каждого поля зарезервирован и равен 0.

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

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

Структура Bmp-файла

Имя

Длина

Смещение

Описание

Заголовок файла (BitMapFileHeader)

Type

2

0

Сигнатура "BM"

Size

4

2

Размер файла

Reserved 1

2

6

Зарезервировано

Reserved 2

2

8

Зарезервировано

OffsetBits

4

10

Смещение изображения от начала файла

Информационный заголовок (BitMapInfoHeader)

Size

4

14

Длина заголовка

Width

4

18

Ширина изображения, точки

Height

4

22

Высота изображения, точки

Planes

2

26

Число плоскостей

BitCount

2

28

Глубина цвета, бит на точку

Compression

4

30

Тип компрессии (0 - несжатое изображение)

SizeImage

4

34

Размер изображения, байт

XpelsPerMeter

4

38

Горизонтальное разрешение, точки на метр

YpelsPerMeter

4

42

Вертикальное разрешение, точки на метр

ColorsUsed

4

46

Число используемых цветов (0 - максимально возможное для данной глубины цвета)

ColorsImportant

4

50

Число основных цветов

Таблица цветов (палитра) (ColorTable)

ColorTable

1024

54

256 элементов по 4 байта

Данные изображения (BitMap Array)

Image

Size

1078

Изображение, записанное по строкам слева направо и снизу вверх

Двумерные матричные преобразования

Рассмотрим преобразования координат точек на плоскости. На рис. 1 точка перенесена в точку .

Рис. 1 Операция переноса или трансляции точки в точку .

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

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

Рис. 2. Операция масштабирования .

После применения операции однородного масштабирования с коэффициентом 2 он переходит в треугольник . Обозначим матрицу масштабирования . Для точек и операция масштабирования в матричном виде будет выглядеть следующим образом:

.

Рассмотрим далее операцию вращения точки на некоторый угол относительно начала координат. На рисунке 24 точка переходит в точку поворотом на угол .

Рис. 24. Операция поворота точки на угол .

Найдем преобразование координат точки А в точку В. Обозначим угол, который составляет радиус-вектор с осью Оx. Пусть r - длина радиус-вектора , тогда

Так как и , то подставляя эти выражения в уравнения для и , получаем:

В матричном виде вращение точки А на угол выглядит следующим образом:

3. Среда разработки

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

3.1 Алгоритм

Это задание реализуется по следующему алгоритму:

-Создание битовых карт для хранения текущего и изменённого изображения. bmp файл компрессия программирование

-Отчистка рабочей области и рисование исходного изображения.

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

-Работа с выбранной процедурой.

4. Описание программы

4.1 Системные требования

1. Операционная система Windows9x и выше.

2. Цветной монитор и видеоадаптер поддерживающий режим SVGA способные работать с полноцветными изображениями, с глубиной цвета 24 бита

Объем оперативной памяти не менее 64Мб

3. Периферийные устройства ввода/вывода клавиатура и мышь.

4. Наличие процессора не ниже i386 и сопроцессора.

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

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

1. -открытие файла.

2. - поворот влево на 10 градусов(способом 1).

3. - поворот вправо на 10 градусов(способом 1).

4. - увеличение размера на 10 процентов.

5. - уменьшение размера на 10 процентов.

6. - сохранить рисунок

7. - поворот изображения на произвольный угол (способ 2)

4.3 Описание процедур

procedure TForm1.FormCreate(Sender: TObject);

Данная процедура реализует создание специальных переменных, хранящих изображение в формате bmp, используя стандартный тип данных в Delphi Tbitmap.

procedure TForm1.OpenPicture1Accept(Sender: TObject);

В этой процедуре происходит реализация таких действий как:

-отчистка рабочего поля.

-загрузка картинки в подготовленную заранее переменную(типа TBitmap).

-прорисовка исходного изображения.(построчно)

-заполнение массива temp1,равного по размерам диагонали исходного изображения. Это необходимо для поворота изображения способом 2

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Эта процедура необходима для выбора действия производимого над изображением

Работа с меню

VK_ESCAPE : Close; выход

VK_LEFT: Left.Execute;поворот влево

VK_RIGHT : Right.Execute;поворот вправо

VK_UP : More.Execute;увеличение

VK_DOWN: Less.Execute;уменьшение

Работа с клавиатурой

VK_NUMPAD4 : Left.Execute; выход

VK_NUMPAD6 : Right.Execute; …

VK_NUMPAD2 : Less.Execute;…

VK_NUMPAD8 : More.Execute;…

procedure TForm1.LeftExecute(Sender: TObject);

Здесь угол поворота увеличивается на 10 градусов, после чего вызывается процедура поворота(способом 1)

procedure TForm1.RightExecute(Sender: TObject);

Здесь угол поворота уменьшается на 10 градусов, после чего вызывается процедура поворота(способом 1)

procedure TForm1.MoreExecute(Sender: TObject);

Эта процедура позволяет увеличить на 10% коэффициент масштабирования, при этом коэффициент масштабирования проверяется на максимально допустимое значение. Затем следует вызов процедуры масштабирования

procedure TForm1.LessExecute(Sender: TObject);

Эта процедура позволяет уменьшить на 10% коэффициент масштабирования, при этом коэффициент масштабирования проверяется на минимально допустимое значение. Затем следует вызов процедуры масштабирования.

procedure TForm1.RangingExecute(Sender: TObject);

Это процедура масштабирования:

Процедура получает из списка глобальных переменных значение коэффициента изображения в процентах (scal).

Создается временный массив изображения, размером, большим размера изображения в scal(коэффициент масштабирования в % ) деленное на 100 раз.

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

procedure TForm1.RotateExecute(Sender: TObject);

Процедура реализации поворота изображения.

Процедура получает из списка глобальных переменных значение угла в градусах(angle).Затем очищает рабочее поле и вычисляет глобальные координаты центра картинки(относительно рабочей области) и локальное(относительно картинки) расстояние между текущей точкой и центром изображения. Следом необходимо вычислить радиус-вектор, используя полученное расстояние. Теперь по формулам:

вычисляем координаты новых точек и выводим их в рабочую область.

procedure TForm1.Rotate2Execute(Sender: TObject);

данная процедура подготавливает данные(исходное изображение, координаты центра изображения, угол поворота) для вызова функции поворота-2

FUNCTION RotateImage(Const BitmapOriginal: TBitmap;

Const AngleOfRotation: Double): TBitmap;

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

Входными параметрами являются:

BitmapOriginal: TBitmap исходное изображение

AngleOfRotation: Double угол поворота

На выходе функция имеет обработанное изображение.

Функцией выполняются следующие действия:

-Создание квадратного массива, с размерами равными диагонали картинки.

-Вычисление угла в радианах и оси вращения изображения

-Задание формата 24-х битового пиксела.

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

4.4 Описание переменных

Глобальные переменные:

Form1: TForm1 рабочее поле

bitmap,Temp,Temp1:TBitmap массивы для bmp

angle:Integer угол в градусах

scal: word=100коэфф. масштабирования в %

offs :integer смещение центра изображения относительно начала рабочего поля

procedure TForm1.OpenPicture1Accept(Sender: TObject) загрузка картинки;

i,j, :integerглобальные координаты(в рабочем поле)

x,y:integer локальные координаты (внутри массивов)

procedure TForm1.RotateExecute(Sender: TObject); поворот

i,j:integerглобальные координаты(в рабочем поле)

x,y:integerцентр изображения

x_n,y_n:integer координаты новой точки

r:realрадиус-вектор

x1,y1:integerрасстояние между текущей точкой и центром изображения

FUNCTION RotateImage

cosTheta : extended косинус угла поворота

I, j: integer;

iOriginal, jOriginal : integer; координаты новой точки

Prime, jPrime : integer ; расстояние от правого, нижнего края большого изображения до центра

RowOriginal: pRGBTripleArray; строка пикселов

RowRotated : pRGBTRipleArray; строка пикселов

sinTheta : integer;

ug : real;угол поворота

xx1 : integer;центр нового изображения

5. Листинг программы

unit rot_scal;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ActnList, StdActns, ExtActns, XPStyleActnCtrls, ActnMan,

ImgList, ToolWin, ComCtrls,

math, StdCtrls;

type

TForm1 = class(TForm)

ToolBar1: TToolBar;

ImageList1: TImageList;

ActionManager1: TActionManager;

OpenPicture1: TOpenPicture;

ToolButton1: TToolButton;

ToolButton2: TToolButton;

ToolButton3: TToolButton;

Rotate: TAction;

Left: TAction;

Right: TAction;

ToolButton4: TToolButton;

ToolButton5: TToolButton;

More: TAction;

Less: TAction;

Ranging: TAction;

Edit1: TEdit;

Rotate2: TAction;/поворот 2

ToolButton6: TToolButton;

SavePicture1: TSavePicture;//сохранеие

procedure OpenPicture1Accept(Sender: TObject); //открытие картинки

procedure FormCreate(Sender: TObject); //создание форм

procedure LeftExecute(Sender: TObject); // запуск левого поворота

procedure RightExecute(Sender: TObject); // запуск правого поворота

procedure FormKeyDown(Sender: TObject; var Key: Word; // нажатие кнопок

Shift: TShiftState);

procedure RotateExecute(Sender: TObject); // вращение

procedure MoreExecute(Sender: TObject); // увеличение

procedure LessExecute(Sender: TObject); // уменьшение

procedure RangingExecute(Sender: TObject);

procedure Edit1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure Rotate2Execute(Sender: TObject);

procedure SavePicture1Accept(Sender: TObject); // масштабирование

private

{ Private declarations }

public

{ Public declarations }

end;

var

offs:integer;//смещение изображения

Form1: TForm1;

bitmap,Temp:TBitmap;

angle:Integer=0;//угол

scal: word=100;//коэфф. масштабирования в %

implementation

{$R *.dfm}

FUNCTION RotateImage(Const BitmapOriginal: TBitmap;// функция для поворота-2

Const iRotationAxis, jRotationAxis: Integer;

Const AngleOfRotation: Double): TBitmap;

CONST

MaxPixelCount = 32768;

TYPE

TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;//палитра

pRGBTripleArray = ^TRGBTripleArray;

VAR

cosTheta : EXTENDED;

i : INTEGER;

iOriginal : INTEGER;

iPrime: INTEGER;

j : INTEGER;

jOriginal : INTEGER;

jPrime: INTEGER;

RowOriginal: pRGBTripleArray;

RowRotated : pRGBTRipleArray;

sinTheta : EXTENDED;

ug : REAL;

xx1 : integer;

begin

ug := AngleOfRotation / 360*2*pi;//угол в радианы

RESULT := TBitmap.Create;

Result.Width := round(sqrt(sqr(BitmapOriginal.Width) + sqr(BitmapOriginal.Height)));

result.Height :=Result.Width;//задаем новый квадратный массив со стороной,равной диагонали

xx1:=round(result.Height/2);//ось вращения

RESULT.PixelFormat := pf24bit;//формат пиксела

sinTheta := SIN(ug);

cosTheta := COS(ug);

FOR j := RESULT.Height-1 DOWNTO 0 DO

BEGIN

RowRotated := RESULT.Scanline[j];//считываем пиксел

jPrime := j - xx1;

FOR i := RESULT.Width-1 DOWNTO 0 DO

BEGIN

iPrime := i - xx1;

iOriginal := xx1 + ROUND(iPrime * CosTheta - jPrime * sinTheta)-round((result.Width-BitmapOriginal.Width)/2);

jOriginal := xx1 + ROUND(iPrime * sinTheta + jPrime * cosTheta)-round((result.Height-BitmapOriginal.Height)/2);

IF (iOriginal >=0) AND (iOriginal <=BitmapOriginal.Width-1) AND

(jOriginal >=0) AND (jOriginal <=BitmapOriginal.Height-1)

THEN BEGIN//если новая точка принадлежит исходному массиву,то сохраняем её в новом

RowOriginal := BitmapOriginal.Scanline[jOriginal];

RowRotated[i] := RowOriginal[iOriginal];

END

ELSE BEGIN//если нет то закрашиваем цветом фона

RowRotated[i].rgbtBlue :=255 ;

RowRotated[i].rgbtGreen :=255;

RowRotated[i].rgbtRed :=255;

END

END

END;

END;

procedure TForm1.FormCreate(Sender: TObject);

begin

bitmap:=TBitmap.Create; // создание битовой карты

Temp:=TBitmap.Create;

Form1.WindowState:=wsMaximized;

end;

//загрузка картинки и очистка формы

procedure TForm1.OpenPicture1Accept(Sender: TObject);

var i,j,x,y:integer;

begin

for i:=0 to Form1.Height-1 do //отчистка формы

for j:=0 to Form1.Width-1 do

Form1.Canvas.Pixels[j,i]:=clWhite;

angle:=0;

bitmap.LoadFromFile(OpenPicture1.Dialog.FileName);

//заголовок

caption:=inttostr(bitmap.Height)+'x'+inttostr(bitmap.Width);

y:=round((form1.Height-bitmap.Height)/2);

x:=round((form1.Width-bitmap.Width)/2);

for i:=0 to bitmap.Width-1 do //вывод изображения

for j:=0 to bitmap.Height-1 do

Form1.Canvas.pixels[i+x,j+y]:=bitmap.Canvas.Pixels[i,j];

temp.Width:=round(sqrt(sqr(bitmap.Height)+sqr(bitmap.Width)));

temp.Height:=temp.Width;

for i:=0 to Temp.Width-1 do //сохраняем новый массив для изображения

for j:=0 to Temp.Height-1 do

if (j>round((Temp.Height-bitmap.Height)/2))and(j<Temp.Height-round((Temp.Height-bitmap.Height)/2))and

(i>round((Temp.Width-bitmap.Width)/2))and(i<Temp.Width-round((Temp.Width-bitmap.Width)/2))

Then

Temp.Canvas.Pixels[i,j]:=bitmap.Canvas.Pixels[i-round((Temp.Width-bitmap.Width)/2),j-round((Temp.Height-bitmap.Height)/2)]

Else Temp.Canvas.Pixels[i,j]:=clWhite;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState); //выбор процедуры

begin

case key of

VK_ESCAPE : Close;

//курсором

VK_LEFT: Left.Execute;

VK_RIGHT : Right.Execute;

VK_UP : More.Execute;

VK_DOWN: Less.Execute;

//клавишами

VK_NUMPAD4 : Left.Execute;

VK_NUMPAD6 : Right.Execute;

VK_NUMPAD2 : Less.Execute;

VK_NUMPAD8 : More.Execute;

end;

end;

procedure TForm1.LeftExecute(Sender: TObject);//увеличиваем угол

begin

angle:=angle+10;

Rotate.Execute; //запускаем процедуру поворота-1

end;

procedure TForm1.RightExecute(Sender: TObject);//уменьшаем угол

begin

angle:=angle-10;

Rotate.Execute; //запускаем процедуру поворота-2

end;

procedure TForm1.MoreExecute(Sender: TObject);// увеличение масштаба

begin

if scal<150 then inc(scal,10);

Ranging.Execute; //запускаем процедуру масштабирования

end;

procedure TForm1.LessExecute(Sender: TObject); // уменьшение масштаба

begin

if scal > 50 Then dec(scal,10);

Ranging.Execute;//запускаем процедуру масштабирования

end;

procedure TForm1.RangingExecute(Sender: TObject);//масштабирование

var x,y,i,j,he,wi:integer;

begin

//заголовок

caption:=inttostr(bitmap.Height)+'x'+inttostr(bitmap.Width)+' '+'Масштаб='+inttostr(scal)+'%';

for i:=0 to Form1.Height-1 do //очистка экрана

for j:=0 to Form1.Width-1 do

Form1.Canvas.Pixels[j,i]:=clWhite;

He:=round(temp.Height*scal/100);//вычисляем размеры отмасштабированного массива

Wi:=round(temp.Width*scal/100);

y:=round((form1.Height-He)/2);//вычисляем смещение изображения относительно начала координат

x:=round((form1.Width-Wi)/2);

for i:=0 to He-1 do

for j:=0 to Wi-1 do

begin

form1.Canvas.Pixels[j+x,i+y]:=temp.Canvas.Pixels[round(j*100/scal),round(i*100/scal)];//выводим изображение

end;

end;

procedure TForm1.RotateExecute(Sender: TObject); //поворот-1

//вращение на angle отн 0

var i,j:integer;

x,y:integer;

x_n,y_n:integer;

r:real;

x1,y1:integer;

begin

for i:=0 to form1.Height-1 do //очищаем рабочую область

for j:=0 to form1.Width-1 do

form1.Canvas.Pixels[j,i]:=clWhite;

//заголовок

caption:=inttostr(bitmap.Height)+'x'+inttostr(bitmap.Width)+' '+'Угол='+inttostr(angle);

x:=round(Form1.Width/2);//находим центр старого изображения

y:=round(Form1.Height/2);

for j:=0 to bitmap.Height-1 do

for i:=0 to bitmap.Width-1 do

Begin

x1:=i-round(bitmap.Width/2);//локальные расстояние между текущей точкой

y1:=-j+round(bitmap.Height/2);// и центром изображения

r:=sqrt(x1*x1+y1*y1);//радиус-вектор

if r<>0 then//если не центральная точка

Begin

x_n:=round(r*((x1/r)*cos(angle*Pi/180)-(y1/r)*sin(angle*Pi/180)));//новая точка

y_n:=round(r*(sin(angle*Pi/180)*(x1/r)+cos(angle*Pi/180)*(y1/r)));

Form1.Canvas.Pixels[x+x_n,y-y_n]:=bitmap.Canvas.Pixels[i,j];//вывод новой точки

End

Else//центральная точка

Begin

Form1.Canvas.Pixels[x,y]:=bitmap.Canvas.Pixels[j,i];//вывод новой точки

End;

End;

end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

var num,err,i,j:integer;

begin

if Key=VK_ESCAPE then Close;//выход

if Key=VK_RETURN Then //проверка на корректный ввод

Begin

val(edit1.Text,num,err);

if err<>0 then Showmessage('Введите корректное значение')

else

begin

angle:=num;

for i:=0 to form1.Height-1 do

for j:=0 to form1.Width-1 do

form1.Canvas.Pixels[i,j]:=clWhite;

Rotate2.Execute;

end;

End;

end;

procedure TForm1.Rotate2Execute(Sender: TObject);//поворот-2

var

bm: TBitMap;

xo, yo: integer;

begin

bm := TBitMap.Create;//откпываем и загружаем картинку

bm.LoadFromFile(OpenPicture1.Dialog.FileName);

xo := (bm.Width div 2);

yo := (bm.Height div 2);

temp:=rotateimage(bitmap,xo,yo,angle);//вызывем функцию для поворота

Ranging.Execute;//вызываем масштабирование

end;

procedure TForm1.SavePicture1Accept(Sender: TObject);//сохранение обработанного файла

var x,y,i,j,he,wi:integer;

begin

Temp.SaveToFile(SavePicture1.Dialog.FileName+'.bmp');

He:=round(temp.Height*scal/100);

Wi:=round(temp.Width*scal/100);

y:=round((form1.Height-He)/2);

x:=round((form1.Width-Wi)/2);

for i:=0 to He-1 do

for j:=0 to Wi-1 do

begin

form1.Canvas.Pixels[j+x,i+y]:=temp.Canvas.Pixels[round(j*100/scal),round(i*100/scal)];

end;

end;

end.

Размещено на Allbest.ru

...

Подобные документы

  • Язык разметки гипертекста HTML, основы работы с Delphi. Разработка формата файла базы данных цвета. Методика подбора цвета для WEB-страниц. Изучение и систематизация информации о правилах создания эргономичных интерфейсов (в том числе WEB-интерфейсов).

    курсовая работа [475,8 K], добавлен 17.07.2009

  • Общая информация о графическом формате. Описание формата Microsoft Windows Bitmap. Структура файла DDВ исходного формата ВМР. Преобразования графических файлов. Просмотр и редактирование растровых изображений. Создание многодокументного приложения.

    дипломная работа [1,5 M], добавлен 06.06.2010

  • Информация о графических форматах. Хранение изображения в программе. Очередь как вспомогательная структура данных. Загрузка изображения из двоичного файла. Операции с изображением. Уменьшение разрешающей способности. Увеличение размера изображения.

    курсовая работа [1,1 M], добавлен 29.06.2013

  • Генерирование и сохранение мелодии в виде звукового файла формата wav. Проведение частотного анализа полученного сигнала. Зависимость объема wav-файлов от разрядности кодирования сигнала. Спектр нот записанного wav-файла с заданной разрядностью.

    лабораторная работа [191,0 K], добавлен 30.03.2015

  • Delphi - среда быстрой разработки, в которой в качестве языка программирования используется типизированный объектно-ориентированный язык Delphi. Варианты программного пакета. Особенности работы, вид экрана после запуска. Описание структуры программы.

    курсовая работа [1,3 M], добавлен 25.11.2014

  • Реализация программы-конвертера для создания на основе передаваемых dbf файлов файла формата XML (по заданному пользователем шаблону). Создание шаблонов при помощи кода и при помощи конструктора. Проектирование архитектуры программного продукта.

    дипломная работа [1,6 M], добавлен 27.06.2013

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

    курсовая работа [254,6 K], добавлен 26.01.2013

  • Средства языка программирования Delphi. Структурные типы данных. Строковые переменные, массивы, множества, файлы. Механизм классов в C++. Интерфейсный и описательный обзоры классов в Delphi. Работа с текстовыми и бинарными файлами прямого доступа.

    курсовая работа [990,4 K], добавлен 07.08.2012

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

    курсовая работа [63,7 K], добавлен 12.12.2010

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

    курсовая работа [33,7 K], добавлен 12.01.2015

  • Предмет объектно-ориентированного программирования и особенности его применения в средах Паскаль, Ада, С++ и Delphi. Интегрированная среда разработки Delphi: общее описание и назначение основных команд меню. Процедуры и функции программы Delphi.

    курсовая работа [40,8 K], добавлен 15.07.2009

  • Основы программирования, работа в консольном режиме Delphi. Правила оформления комментариев. Типы данных, используемые в консольном режиме. Текстовый редактор Delphi Memo. Пример загрузки текстового файла. Примеры решения и оформления простейших задач.

    отчет по практике [2,1 M], добавлен 11.03.2014

  • Delphi как среда разработки программ, ориентированных на работу в Windows. Назначение и преимущество использования электронных учебников. Описание возможностей среды Delphi 5 для разработки электронного учебника. Варианты применения служб Internet.

    дипломная работа [3,6 M], добавлен 13.07.2011

  • Программа по организации заполнения массива объектов приложения из внешнего файла данных формата csv. Описание модуля Def.h, Plant.h и Main.cpp. Контрольный пример работы программы. Рассмотрение передачи неправильного имени файла в качестве параметра.

    курсовая работа [567,9 K], добавлен 27.01.2013

  • Назначение команды "diskcomp". Текст и запуск командного файла. Сравнение команды в Windows 7 и Windows XP. Разработка файла-сценария в ОС Linux. Создание файла в подкаталоге. Создание файла "oglavlenie.txt" с отсортированным по времени списком файлов.

    курсовая работа [1,6 M], добавлен 22.08.2012

  • Эффективные средства разработки программного обеспечения. Технология визуального проектирования и событийного программирования. Конструирование диалоговых окон и функций обработки событий. Словесный алгоритм и процедуры программы Borland Delphi 7 Studio.

    дипломная работа [660,2 K], добавлен 21.05.2012

  • Язык программирования Турбо Паскаль. Запись алгоритма на языке программирования и отладка программы. Правила записи арифметических выражений. Стандартное расширение имени файла, созданного системным редактором. Составной оператор и вложенные условия.

    курсовая работа [75,0 K], добавлен 21.03.2013

  • Характеристика системы программирования. Главные составные части Delphi. Интерфейс программного приложения. Результаты работы программы. Руководство системного программиста и оператора. Язык программирования Delphi, среда компилятора Borland 7.0.

    курсовая работа [1,6 M], добавлен 29.05.2013

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

    методичка [619,9 K], добавлен 17.11.2011

  • Принципы программирования файловой структуры в операционной системе Windows. Свойства и методы класса Tstream. Пример создания, чтения и записи потока. Чтение, запись и внутренняя структура файла. Пример чтения из файла, начиная с заданной позиции.

    курсовая работа [251,6 K], добавлен 18.05.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.