Формат 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.2015Delphi - среда быстрой разработки, в которой в качестве языка программирования используется типизированный объектно-ориентированный язык 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.2014Delphi как среда разработки программ, ориентированных на работу в 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