Работа с файлами и мультимедиа
Download 361.5 Kb.
|
Работа с файлами и мультимедиа
- Bu sahifa navigatsiya:
- Классы TPicture и TGraphic
Листинг 15.1. Простейшее приложение для просмотра рисунков
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, StdCtrls, jpeg; type TForm1 = class(TForm) Img: TImage; OpenBtn: TButton; ProgressBar: TProgressBar; OpenDlg: TOpenDialog; Bevel1: TBevel; procedure OpenBtnClick(Sender: TObject); procedure ImgProgress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: String); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.OpenBtnClick(Sender: TObject); begin if OpenDlg.Execute then Img.Picture.LoadFromFile(OpenDlg.FileName); end; procedure TForm1.ImgProgress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: String); begin ProgressBar.Position:=PercentDone; if RedrawNow then Img.Repaint; end; end. Чтобы можно было просматривать достаточно большие рисунки, не помещающиеся целиком в отведенную область, следует установить свойство Proportional компонента Img в истину, а для лучшего эстетического восприятия не помешает его еще и разместить по центру, установив в истину так же и свойство Center. Этот пример можно найти в каталоге Demo\Part3\SimpleImg. Классы TPicture и TGraphic Как уже было отмечено, важнейшей частью компонента Image является свойство Picture (рисунок), имеющее тип TPicture. Именно оно используется для работы с самим изображением, включая такие операции, как чтение из файла и запись в файл. Оригинальный размер изображения так же доступен через свойства Height и Width рисунка. В свою очередь, класс TPicture включает в себя несколько свойств, основанных на классе TGraphic, которые собственно и могут содержать само изображение. Всего предусмотрено несколько таких свойств: Bitmap типа TBitmap - для файлов типа BMP; Icon типа TIcon - для файлов типа ICO; MetaFile типа TMetaFile - для файлов типа WMF или EMF. Кроме них, существует еще свойство Graphic, которое ссылается на картинку вне зависимости от конкретного формата и имеет такие общие для всех рисунков свойства, как Height, Width и Transparent. Поэтому в тех случаях, когда тип изображения заведомо неизвестен, следует использовать именно это свойство. Более того, если используются нестандартные для Windows и Delphi типы графических фалов (взять тот же JPEG, который является опциональным в VCL), то только через свойство Graphic к нему и можно будет обращаться для того, чтобы, скажем, узнать размеры. Собственно говоря, когда используются свойства Height или Width объекта Picture, то они берут значения как раз от этого объекта. Вообще можно отметить, что компонент Image является всего лишь полем для отображения изображений, поддержка которых полностью возложена на класс TPicture и его дочерние свойства, основанные на TGraphic. Единственной его особенностью являются сервисные функции для масштабирования изображений. В то же время, если этого не требуется, то можно просто создать программными методами экземпляр класса TPicture и выводить изображение на поверхность любого компонента, имеющего свойство Canvas: var Pic: TPicture; ... Pic:=TPicture.Create; Pic.LoadFromFile('c:\mypicture.bmp'); Form1.Canvas.Draw(1,1,Pic.Graphic); Кроме того, "сам по себе" класс TPicture может быть полезным при работе с таким компонентом, как ImageList. Например, можно сделать так, чтобы рисунки для изображений меню или панелей инструментов загружались из отдельного файла. В таком случае даже помещать ImageList на форму во время проектирования приложения, в обще-то не обязательно - все можно делать во время работы приложения. Кроме того, поскольку формат файл заранее известен - это будет BMP, то использовать класс TPicture так же нет необходимости, проще будет сразу обратиться к классу TBitmap - все равно TPicture будет просто переадресовывать все обращения к своему свойству Bitmap: var ImgLst: TImageList; Bmp: TBitmap; ... ImgLst:=TImageList.Create; Bmp:=TPicture.Create; Bmp.LoadFromFile('tools.bmp'); Bmp.Transparent:=true; ImgList.AddMasked(Bmp,Bmp.TransparentColor); Но в ряде иных случаев использование самого класса TPicture может быть более предпочтительным по той причине, что таким образом можно обеспечить поддержку других форматов. Для примера рассмотрим приложение, которое сможет не только показывать, но и создавать графические файлы. Для этого нам понадобится создать новое приложение, на главной форме которого расположим какой-либо объект, на поверхности которого можно рисовать, скажем, тот же Image. По традиции, назовем форму MainFrm, а изображение - Img. Затем поместим на форме 2 кнопки и назовем одну InsertBtn (вставить), а другую - SaveBtn (сохранить). Так же нам потребуется 2 диалога - для того, чтобы открывать и сохранять картинки. Используем специализированные диалоги OpenPictureDialog (OpenPicDlg) и SavePictureDialog (SavePicDlg). Для того чтобы область, выделенная для творчества, была изначально заполнена белым фоном, имитируя лист бумаги, для события OnCreate или OnShow формы можно предусмотреть следующий код: Img.Canvas.Brush.Color:=clWhite; Img.Canvas.FillRect(Rect(0,0,Img.Width,Img.Height)); После проделанной подготовительно работы напишем код для кнопки вставки, которая будет вставлять в центр рисунка изображение из выбранного файла: procedure TMainFrm.InsertBtnClick(Sender: TObject); var Pic: TPicture; begin if not OpenPicDlg.Execute then exit; Pic:=TPicture.Create; Pic.LoadFromFile(OpenPicDlg.FileName); Img.Canvas.Draw((Img.Width-Pic.Width) div 2,(Img.Height-Pic.Height) div 2,Pic.Graphic); Pic.Free; end; Таким образом, при помощи метода Draw холста, мы можем вывести любое количество рисунков из файлов разных типов. В данном случае все они будут центрированы по середине изображения, но при необходимости можно было бы выводить их, скажем, в то место, где был произведен последний щелчок мышью. Но это еще не все: все-таки составлять коллажи - не единственная возможность, предоставляемая холстом. Можно на нем просто рисовать, что уже было рассмотрено в предыдущей части книги. Между тем, мы можем не просто выводить какие-либо предопределенные фигуры, но и предоставить пользователю возможность нарисовать что-либо. Пусть это будут хотя бы простые линии, которые будут появляться после того, как пользователь нажмет на левую клавишу мышки, переместит указатель, и отпустит клавишу. Для этого мы задействуем обработчики событий OnMouseDown и OnMouseUp для объекта Img, и используем методы MoveTo и LineTo его холста: procedure TMainFrm.ImgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Img.Canvas.MoveTo(X,Y); end; procedure TMainFrm.ImgMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Img.Canvas.LineTo(X,Y); end; Наконец, нам остается реализовать возможность сохранения того, что в данный момент отображается в Img. Для этого нам и пригодится 2-я кнопка, код для которой будет выглядеть следующим образом: if SavePicDlg.Execute then Img.Picture.SaveToFile(SavePicDlg.FileName); Таким образом, все, что нарисовано на холсте, может быть без каких-либо ухищрений сохранено в качестве обычного файла в формате Windows Bitmap. Исходный код этой программы можно найти в каталоге Demo\Part3\PicEdit. Download 361.5 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling