Конвертація графічних форматів, Різне, Програмування, статті

За допомогою Delphi можна повноцінно конвертувати графічні формати один в інший. Для роботи із зображеннями існує кілька визначених класів. Розглянемо деякі варіанти конвертації.

1. Конвертування BMP в EMF.


Наступна нескладна процедура конвертує 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;

2. Конвертування 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;


В Uses необхідно додати модулі Jpeg і Clipbrd. У даному прикладі chrtOutputSingle – Це об’єкт TChart (Сторінка Additional). Перед викликом функції в буфері обміну повинен знаходитися об’єкт типу TBitmap.

3. Конвертування 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;
finally
Bitmap.Free;
MetaFile.Free;
end;
end;


Приклад використання: ConvertBMP2WMF( “c:mypic.bmp” , “c:mypic.wmf”).

4. Зворотне конвертування: 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;
end;


Використання: ConvertWMF2BMP(“c:mypic.wmf” , “c:mypic.bmp”).
5. Конвертування BMP в DIB.


Припустимо, що файл зберігається у форматі BMP. Потрібно його перетворити в DIB і відобразити. Отже … Це не тривіально, але допомогти нам зможуть функції GetDIBSizes і GetDIB з модуля GRAPHICS.PAS. Наведу дві процедури: одну для створення DIB з TBitmap і другу для його звільнення:


{Перетворення 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, InfoSize);
if Bits <> nil then
GlobalFreePtr(Bits);
BitmapInfo := nil;
Bits := nil;
raise ;
end;
end;
{Використовуйте FreeDIB для звільнення інформації про зображення і бітових покажчиків}
procedure FreeDIB(BitmapInfo: PBitmapInfo;
InfoSize: integer;
Bits: pointer;
BitsSize: longint);
begin
if BitmapInfo <> nil then
FreeMem(BitmapInfo, InfoSize);
if Bits <> nil then
GlobalFreePtr(Bits);
end;


Створюємо форму з TImage Image1 і завантажуємо в нього 256-кольорове зображення, потім поруч розміщуємо TPaintBox. Додаємо наступні рядки до private-оголошеннях вашої форми:
{ Private declarations }
BitmapInfo : PBitmapInfo;
InfoSize : integer;
Bits : pointer;
BitsSize : longint;
Створюємо нижченаведені обробники подій, які демонструють процес відтворення DIB:
procedure TForm1.FormCreate(Sender: TObject);
begin
BitmapToDIB(Image1.Picture.Bitmap, BitmapInfo, InfoSize,
Bits, BitsSize);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeDIB(BitmapInfo, InfoSize, Bits, BitsSize);
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
OldPalette: HPalette;
begin
if Assigned(BitmapInfo) and Assigned(Bits) then
with BitmapInfo^.bmiHeader, PaintBox1.Canvas do
begin
OldPalette := SelectPalette(Handle,
Image1.Picture.Bitmap.Palette,
false);
try
RealizePalette(Handle);
StretchDIBits(Handle, 0 , 0 , PaintBox1.Width, PaintBox1.Height,
0 , 0 , biWidth, biHeight, Bits,
BitmapInfo^, DIB_RGB_COLORS,
SRCCOPY);
finally
SelectPalette(Handle, OldPalette, true);
end;
end;
end;
Це допоможе вам зробити перший крок. Єдине, що ви можете захотіти, це створити власний HPalette на основі DIB, Замість використання TBitmap і своєї палітри. Функція з ім’ям PaletteFromW3DIB з GRAPHICS.PAS саме цим і займається, але вона не оголошена як експортованої, тому для її використання необхідно скопіювати її вихідний код і вставити його в модуль.

6. Конвертування BMP в ICO.


Вам необхідно створити два бітмапи, бітмап маски (назвемо його “AND” bitmap) та бітмап зображення (назвемо його XOR bitmap). Ви можете пропустити обробники для “AND” і “XOR” бітмапи в Windows API функції CreateIconIndirect () і використовувати обробник повернутої іконки в Вашому додатку.

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 ;


Спосіб перетворення зображення розміром 32×32 в іконку:
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( “c:myicon.ico” );
end;
end.

7. Конвертування 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 := “{ tf1 {pictdibitmap0 ” ;
SetLength(hexpict, (Length(bb) + Length(bi)) * 2 );
I := 2 ;
for bis := 1 to Length(bi) do
begin
achar := IntToHex(Integer(bi[bis]), 2 );
hexpict[I – 1] := achar[ 1 ];
hexpict[I] := achar[ 2 ];
Inc(I, 2 );
end ;
for bbs := 1 to Length(bb) do
begin
achar := IntToHex(Integer(bb[bbs]), 2 );
hexpict[I – 1] := achar[ 1 ];
hexpict[I] := achar[ 2 ];
Inc(I, 2);
end ;
rtf := rtf + hexpict + ” }}”;
Result := rtf;
end;

8. Конвертування CUR в BMP.


Перетворення курсора в bitmap:

procedure TForm1.Button1Click(Sender: TObject);
var
hCursor: LongInt;
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.Width := 32 ;
Bitmap.Height := 32 ;
hCursor := LoadCursorFromFile( “test.cur” );
DrawIcon(Bitmap.Canvas.Handle, 0 , 0 , hCursor);
Bitmap.SaveToFile( “test.bmp” );
Bitmap.Free;
end;

9. Конвертування ICO в BMP.

Var
Icon : TIcon;
Bitmap : TBitmap;
begin
Icon := TIcon.Create;
Bitmap := TBitmap.Create;
Icon.LoadFromFile( “c:picture.ico” );
Bitmap.Width := Icon.Width;
Bitmap.Height := Icon.Height;
Bitmap.Canvas.Draw( 0 , 0 , Icon);
Bitmap.SaveToFile( “c:picture.bmp” );
Icon.Free;
Bitmap.Free;
end;


Варіант 2:

procedure TIconShow.FileListBox1Click(Sender: TObject);
var
MyIcon: TIcon;
MyBitMap: TBitmap;
begin
MyIcon := TIcon.Create;
MyBitMap := TBitmap.Create;
try
{Отримуємо ім’я файлу і пов’язану з ним іконку}
strFileName := FileListBox1.Items[FileListBox1.ItemIndex];
StrPCopy(cStrFileName, strFileName);
MyIcon.Handle := ExtractIcon(hInstance, cStrFileName, 0 );
{Малюємо іконку на bitmap в speedbutton}
SpeedButton1.Glyph := MyBitMap;
SpeedButton1.Glyph.Width := MyIcon.Width;
SpeedButton1.Glyph.Height := MyIcon.Height;
SpeedButton1.Glyph.Canvas.Draw( 0 , 0 , MyIcon);
SpeedButton1.Hint := strFileName;
finally
MyIcon.Free;
MyBitMap.Free;
end;
end;


Щоб перетворити Icon в Bitmap, використовуйте TImageList. Для зворотного перетворення замініть метод AddIcon на Add, і метод GetBitmap на GetIcon.
function Icon2Bitmap(Icon: TIcon): TBitmap;
begin
with TImageList.Create ( nil ) do
begin
AddIcon (Icon);
Result := TBitmap.Create;
GetBitmap ( 0 , Result);
Free;
end;
end;


10. Конвертування JPG в BMP.


uses
JPEG;
procedure JPEGtoBMP( const FileName: TFileName);
var
jpeg: TJPEGImage;
bmp: TBitmap;
begin
jpeg := TJPEGImage.Create;
try
jpeg.CompressionQuality := 100 ; {Default Value}
jpeg.LoadFromFile(FileName);
bmp := TBitmap.Create;
try
bmp.Assign(jpeg);
bmp.SaveTofile(ChangeFileExt(FileName, “.bmp” ));
finally
bmp.Free;
end;
finally
jpeg.Free;
end;
end;


Ми розглянули способи конвертації різних графічних форматів. Всі вони досить прості.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*