
- •Методічні вказівки та контрольні завдання
- •Лабораторна робота №1
- •Лабораторна робота №2
- •Лабораторна робота №3
- •Лабораторна робота №4
- •Лабораторна робота №5
- •Процедура конвертації форматів bmp в wmf
- •Конвертація bmp в ico
- •Лабораторна робота №6
- •Завдання для самостійної роботи:
- •Лабораторна робота №7
- •Лабораторна робота №8
- •Завдання для самостійної роботи
- •Список використаної літератури
Лабораторна робота №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 інтерфейс, тобто працювати з головним і дочірніми вікнами.