Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
default.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
981.5 Кб
Скачать

Лабораторна робота №5

СТВОРЕННЯ УНІВЕРСАЛЬНОГО КОНВЕРТОРА ГРАФІЧНИХ ФАЙЛІВ

У лабораторній роботі №5 необхідно самостійно розробити інтерфейс програмного продукту. Як приклад приведені основні алгоритмічні функції конвертації графічних файлів в різні формати.

Нижче приведена процедура, яка конвертує файли *.bmp (SourceFileName) у *.emf і розташовує отриманий файл в тій же директорії, що і початковий файл.

function bmp2emf( const SourceFileName: TFileName): Boolean;

var

Metafile: TMetafile; MetaCanvas: TMetafileCanvas; Bitmap: TBitmap;

begin

Metafile := TMetaFile.Create;

try

Bitmap := TBitmap.Create;

try

Bitmap.LoadFromFile(SourceFileName);

Metafile.Height := Bitmap.Height;

Metafile.Width := Bitmap.Width;

MetaCanvas := TMetafileCanvas.Create(Metafile, 0);

try

MetaCanvas.Draw(0, 0, Bitmap);

finally

MetaCanvas.Free;

end;

finally

Bitmap.Free;

end;

Metafile.SaveToFile(ChangeFileExt(SourceFileName '.emf'));

finally

Metafile.Free;

end;

end;

Приклад виклику приведеної структури:

procedure TForm1.Button1Click(Sender: TObject);

begin

bmp2emf( 'C:\TestBitmap.bmp' );

end;

Процедура конвертації BMP в JPG

procedure TfrmMain.ConvertBMP2JPEG;

var

jpgImg: TJPEGImage;

begin

chrtOutputSingle.CopyToClipboardBitmap;

Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);

jpgImg := TJPEGImage.Create;

jpgImg.Assign(Image1.Picture.Bitmap);

jpgImg.SaveToFile('TChartExample.jpg');

end;

При розробці процедури конвертації bmp в jpg в розділі Uses необхідно додати модулі Jpeg і Clipbrd. У даному прикладі chrtOutputSingle - це об'єкт TChart (компонент знаходиться на сторінці Additional). Перед викликом функції в буфері обміну повинен знаходитися об'єкт типу TBitmap.

Процедура конвертації форматів bmp в wmf

procedure ConvertBMP2WMF (const BMPFileName, WMFFileName: TFileName);

var

MetaFile : TMetafile;

Bitmap : TBitmap;

begin

Metafile := TMetaFile.Create;

Bitmap := TBitmap.Create;

try

Bitmap.LoadFromFile(BMPFileName);

with MetaFile do

begin

Height := Bitmap.Height;

Width := Bitmap.Width;

Canvas.Draw( 0, 0, Bitmap);

SaveToFile(WMFFileName);

end;

Конвертація bmp в ico

Для цього необхідно створити два файли bitmap (*.bmp), bitmap маски (ім'я - "AND" bitmap) і bitmap зображення (ім'я - XOR bitmap).

procedure TForm1.Button1Click(Sender: TObject);

var

IconSizeX : integer;

IconSizeY : integer;

AndMask : TBitmap;

XOrMask : TBitmap;

IconInfo : TIconInfo;

Icon : TIcon;

begin

{ Отримуємо розмір ікони}

IconSizeX := GetSystemMetrics(SM_CXICON);

IconSizeY := GetSystemMetrics(SM_CYICON);

{Створення маски "And"}

AndMask := TBitmap.Create;

AndMask.Monochrome := true;

AndMask.Width := IconSizeX;

AndMask.Height := IconSizeY;

{Малюємо на масці "And"}

AndMask.Canvas.Brush.Color := clWhite;

AndMask.Canvas.FillRect(Rect( 0, 0

IconSizeX, IconSizeY));

AndMask.Canvas.Brush.Color := clBlack;

AndMask.Canvas.Ellipse( 4, 4, IconSizeX - 4, IconSizeY - 4 );

Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, AndMask);

{Створення маски "XOr"}

XOrMask := TBitmap.Create;

XOrMask.Width := IconSizeX;

XOrMask.Height := IconSizeY;

{Малюємо на масці "XOr"}

XOrMask.Canvas.Brush.Color := ClBlack;

XOrMask.Canvas.FillRect(Rect( 0, 0, IconSizeX

IconSizeY));

XOrMask.Canvas.Pen.Color := clRed;

XOrMask.Canvas.Brush.Color := clRed;

XOrMask.Canvas.Ellipse( 4, 4, IconSizeX - 4, IconSizeY - 4 );

Form1.Canvas.Draw(IconSizeX * 4, IconSizeY, XOrMask);

{Створюємо ікону}

Icon := TIcon.Create;

IconInfo.fIcon := true;

IconInfo.xHotspot := 0 ;

IconInfo.yHotspot := 0 ;

IconInfo.hbmMask := AndMask.Handle;

IconInfo.hbmColor := XOrMask.Handle;

Icon.Handle := CreateIconIndirect(IconInfo);

{ Знищуємо тимчасові файли}

AndMask.Free;

XOrMask.Free;

Form1.Canvas.Draw(IconSizeX * 6, IconSizeY, Icon);

{ Оголошуємо ікону як ікону застосування}

Application.Icon := Icon;

{ генеруємо перемальовування}

InvalidateRect(Application.Handle, nil, true);

{Звільняємо ікону}

Icon.Free;

end ;

Спосіб перетворення зображення розміром 32x32 в ікону

unit main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls

Forms, Dialogs, ExtCtrls, StdCtrls;

type

TForm1 = class (TForm)

Button1: TButton;

Image1: TImage;

Image2: TImage;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end ;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

winDC, srcdc, destdc: HDC;

oldBitmap: HBitmap;

iinfo: TICONINFO;

begin

GetIconInfo(Image1.Picture.Icon.Handle, iinfo);

WINDC := getDC(handle);

srcDC := CreateCompatibleDC(WINDC);

destDC := CreateCompatibleDC(WINDC);

oldBitmap := SelectObject(destDC, iinfo.hbmColor);

oldBitmap := SelectObject(srcDC, iinfo.hbmMask);

BitBlt(destdc, 0, 0, Image1.picture.icon.width,

Image1.picture.icon.height,

srcdc, 0, 0, SRCPAINT);

Image2.picture.bitmap.handle := SelectObject(destDC, oldBitmap);

DELETEDC(destDC);

DELETEDC(srcDC);

DELETEDC(WINDC);

image2.Picture.Bitmap.savetofile(ExtractFilePath(Application.ExeName)

+ 'myfile.bmp' );

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

image1.picture.icon.loadfromfile( 'x:\myicon.ico'

);

end;

end.

Процедура конвертації BMP в RTF

function BitmapToRTF(pict: TBitmap): string ;

var

bi, bb, rtf: string ;

bis, bbs: Cardinal;

achar: ShortString;

hexpict: string ;

I: Integer;

begin

GetDIBSizes(pict.Handle, bis, bbs);

SetLength(bi, bis);

SetLength(bb, bbs);

GETDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);

rtf := '{rtf1 {pict\dibitmap0 ' ;

finally

Bitmap.Free;

MetaFile.Free;

end;

end;

Приклад використання: ConvertBMP2WMF( 'x:\mypic.bmp', 'x:\mypic.wmf').

Зворотна конвертація: WMF в BMP.

procedure ConvertWMF2BMP (const WMFFileName, BMPFileName: TFileName);

var

MetaFile : TMetafile;

Bitmap : TBitmap;

begin

Metafile := TMetaFile.Create;

Bitmap := TBitmap.Create;

try

MetaFile.LoadFromFile(WMFFileName);

with Bitmap do

begin

Height := Metafile.Height;

Width := Metafile.Width;

Canvas.Draw( 0, 0, MetaFile);

SaveToFile(BMPFileName);

end;

finally

Bitmap.Free;

MetaFile.Free;

end;

Використання: ConvertWMF2BMP('c:\mypic.wmf', 'c:\mypic.bmp').

Процедура конвертації BMP в DIB

Якщо необхідно файл формату BMP перетворити в DIB, то необхідність використовувати функції GetDIBSizes і GETDIB з модуля GRAPHICS.PAS.

{ Перетворення TBitmap в DIB }

procedure BitmapToDIB(Bitmap: TBitmap;

var BitmapInfo: PBitmapInfo;

var InfoSize: integer;

var Bits: pointer;

var BitsSize: longint);

begin

BitmapInfo := nil ;

InfoSize := 0;

Bits := nil;

BitsSize := 0;

if not

Bitmap.Empty then

try

GetDIBSizes(Bitmap.Handle, InfoSize, BitsSize);

GetMem(BitmapInfo, InfoSize);

Bits := GlobalAllocPtr(GMEM_MOVEABLE, BitsSize);

if Bits = nil then

raise

EOutOfMemory.Create( 'Не вистачає пам'яті для пікселів зображення' );

if not GETDIB(Bitmap.Handle, Bitmap.Palette, BitmapInfo^, Bits^) then

raise Exception.Create( 'Не можу створити DIB' );

except

if BitmapInfo <> nil then

FreeMem(BitmapInfo

Для самостійної роботи необхідно виконати:

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

2. Додати зворотну конвертацію для приведених вище форматів.

3. Створити для цього застосування MDI інтерфейс, тобто працювати з головним і дочірніми вікнами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]