Delphi форматы графических файлов
Использование диалогов для загрузки и сохранения графических файлов
Для удобства открытия картинок существует пара компонентов-диалогов: TOpenPictureDialog и TSavePictureDialog.
Список форматов открываемых файлов определяется свойством Filter. Можно, как в случае со стандартными диалогами TOpenDiaiog или TSaveDialog, сформировать их вручную с помощью редактора свойства Filter. Можно поступить проще, воспользовавшись готовыми средствами. Для удобства формирования строк графических фильтров существуют три специальные функции:
Формирует строку с полным текстом графического фильтра, позволяющего открывать все файлы, форматы которых являются потомками параметра GraphicClass. Если в качестве параметра этой функции будет передан класс TGraphic, то в строке будут перечислены все форматы:
Формат JPEG появляется в перечне, если в приложении используется модуль с тем же названием – JPEG. В приводимом ниже примере возникла необходимость совместить фильтры только для классов TBitmap и TJPEGimage, которые не являются предками друг друга. В этом случае получившиеся строки нужно соединить, использовав символ конкатенации "|":
Возвращает расширение файла, формат которого соответствует графическому классу GraphicClass. Так, если передать в качестве параметра класс TBitmap, то функция вернет строку 'BMP';
Эта функция возвращает перечень расширений файлов с форматами – потомками GraphicClass, перечисленных через точку с запятой.
Для диалогов предусмотрено несколько событий, которые программист может обработать самостоятельно. Первые три – достаточно тривиальные: OnShow, oncanciose и enclose. Нужно предостеречь программиста: по чьему-то недосмотру последние два вызываются только в случае нормального завершения диалога (нажатием кнопки Open или Save), а если завершить диалог нажатием кнопки Cancel или "крестика" на заголовке диалога, то управления они не получат.
Другие три события связаны с изменениями, которые осуществляет пользователь во время выбора нужного файла. Они происходят в момент изменения формата открываемого файла (событие onTypeChange), изменения текущей папки (OnFolderChange) и текущего файла (OnSelectionChange).
Но разработчики диалогов не предусмотрели одну очень нужную возможность. Дело в том, что у разных графических форматов возможны различные опции и варианты. Если вы имеете опыт работы с графическими пакетами вроде Adobe Photoshop или Corel, то знаете, что, в зависимости от выбранного формата сохранения данных, диалог изменяет свой внешний вид – к нему добавляются элементы управления, соответствующие параметрам формата.
Поступим так и мы, предусмотрев настройку при сохранении файлов формата JPEG. Для этого будет использовано событие OnTypeChange компонента TSavePictureDialog. Для события нужно проверить значение свойства Filterindex. Если оно больше 1 (т. е. выбраны файлы формата JPEG), нужно увеличить высоту окна диалога и разместить на нем дополнительные компоненты : флажок, соответствующий свойству ProgressiveEncoding, и редактор свойства compressionQuaiity (рис. 10.2). Если тип файла снова поменялся и стал равным 1, нужно эти компоненты убрать.
Рис. 10.2. Внешний вид модифицированного компонента TSavePictureDiaiog
Поможет нам в этом внимательное изучение исходных кодов диалогов, находящихся в модуле EXTDLGS.PAS. Программисты Borland пошли по пути модернизации внешнего вида стандартных диалогов, добавив к ним справа панель для отображения внешнего вида открываемых (записываемых) картинок. Можно пойти дальше и добавить таким же образом и свои элементы управления.
С помощью Delphi можно полноценно конвертировать графические форматы один в другой. Для работы с изображениями существует несколько предопределённых классов. Рассмотрим некоторые варианты конвертирования.
1. Конвертирование BMP в EMF
Следующая несложная процедура конвертирует bmp-файл SourceFileName в emf-файл и располагает его в той же директории, что и исходный файл.
2. Конвертирование BMP в JPG
Данная процедура выполняет такое конвертирование:
В Uses необходимо добавить модули Jpeg и Clipbrd. В данном примере chrtOutputSingle - это объект TChart (страница Additional). Перед вызовом функции в буфере обмена должен находиться объект типа TBitmap.
3. Конвертирование BMP в WMF
Данное конвертирование также не составляет труда:
4. Обратное конвертирование: WMF в BMP
Обратное конвертирование мало чем отличается от предыдущего:
5. Конвертирование BMP в DIB
Допустим, что файл хранится в формате BMP. Нужно его преобразовать в DIB и отобразить. Итак. Это не тривиально, но помочь нам смогут функции GetDIBSizes и GetDIB из модуля GRAPHICS.PAS. Приведу две процедуры: одну для создания DIB из TBitmap и вторую для его освобождения:
Создаём форму с TImage Image1 и загружаем в него 256-цветное изображение, затем рядом размещаем TPaintBox. Добавляем следующие строчки к private-объявлениям нашей формы:
Создаем нижеприведенные обработчики событий, которые демонстрируют процесс отрисовки DIB:
Это поможет вам сделать первый шаг. Единственное, что вы можете захотеть, это создать собственный HPalette на основе DIB, вместо использования TBitmap и своей палитры. Функция с именем PaletteFromW3DIB из GRAPHICS.PAS как раз этим и занимается, но она не объявлена в качестве экспортируемой, поэтому для ее использования необходимо скопировать ее исходный код и вставить его в модуль.
6. Конвертирование BMP в ICO
Вам необходимо создать два битмапа, битмап маски (назовём его "AND" bitmap) и битмап изображения (назовём его XOR bitmap). Вы можете пропустить обработчики для "AND" и "XOR" битмапов в Windows API функции CreateIconIndirect() и использовать обработчик возвращённой иконки в Вашем приложении.
Способ преобразования изображения размером 32x32 в иконку:
7. Конвертирование BMP в RTF
Да, и такое тоже возможно. Вот так например:
8. Конвертирование CUR в BMP
Преобразование курсора в TBitmap:
9. Конвертирование ICO в BMP
Чтобы преобразовать Icon в Bitmap, используйте TImageList. Для обратного преобразования замените метод AddIcon на Add, и метод GetBitmap на GetIcon.
10. Конвертирование JPG в BMP.
Статья добавлена: 1 июня 2005
Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.
Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:
Ссылка для форумов (BBCode):
Поделитесь ссылкой в социальных сетях:
Комментарии читателей к данной статье
Пока нет комментариев к данной статье. Оставьте свой и он будет первым.
Помогите пожалуйста сделать программу конвертер графических файлов. У меня есть функции и вызовы. Пробывал все прописывать работает только 1 конвертер конвертитует из BMP в Jpeg остальные не работают.
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 и вторую для его освобождения:
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;
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);
AndMask := TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;
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);
XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;
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);
Form1.Canvas.Draw(IconSizeX * 6 , IconSizeY, Icon);
InvalidateRect(Application.Handle, nil , true);
Icon.Free;
end ;
Способ преобразования изображения размером 32x32 в иконку:
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls;
TForm1 = class (TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end ;
procedure TForm1.Button1Click(Sender: TObject);
var
winDC, srcdc, destdc: HDC;
oldBitmap: HBitmap;
iinfo: TICONINFO;
begin
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 := ' 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);
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;
BMP, JPEG, TIFF, GIF – самые разнообразные форматы растровых изображений. Давайте-ка разберемся, когда и что лучше использовать.
1. BMP
Прежде всего следует знать, что он не настолько популярен среди пользователей Интернета, так как BMP – это старый формат картинок, с помощью которого сохраняются только растровые изображения, а векторные не поддерживаются.
Размеры формата bmp могут быть разными, в зависимости от качества изображения картинок.
Несмотря на то, что пользователи считают BMP формат устаревшим, его активно используют во многих сферах деятельности. Например, все интерфейсы Windows были созданы на основе этого формата. Почему именно он? Потому что его удобно использовать при создании картинок, которые не теряют качества после их изменений. Зачастую BMP используется в Фотошопе при редактировании картинок, так же подобные изображения легко загружаются в социальные сети и на различные сайты.
Конечно, лучше использовать современные форматы картинок, поскольку они многослойные и способны без технических проблем загрузится на любой сайт. Вместе с тем, они имеют много возможностей для редактирования изображений, да и у них меньший объем файла.
2. JPEG
Формат картинки, который сохраняет в себе запись графического изображения.
Он имеет хорошее качество сжатия для просмотра картинок.
Достоинства данного формата не малы, ведь у пользователя есть некоторые преимущества, такие как: возможность изменения качества и размеров файла, легкость открытия в любом браузере, редакция в любых графических программах, а также маленький вес, который не так много занимает место на компьютерах и прочих носителях. Если не сильно сжимать картинку в формате jpg, её качество полностью не потеряется.
У этого формата есть недостатки, их немного:
А) Нет прозрачности, как например в формате PNG.
Б) Если сильно сжать (изменить размеры картинки) изображение jpg, будет заметно искажение картинки или ее полная потеря.
В) Не рекомендуется редактировать восстановленный файл jpg после сжатия, так как он может потерять качество просмотра.
Несмотря на недостатки формата, его считают наиболее популярным форматом картинок в Интернете и люди им пользуются.
3. TIFF
Известный растровый формат, поддерживающий практически все известные цветовые пространства. Вариант без сжатия практически стал стандартом в полиграфии. Возможно применение различных алгоритмов сжатия без потерь и с потерями.
В файле формата TIFF изображение может храниться в цветовых моделях CMYK, RGB, Lab в режиме индексированных цветов, а также в виде оттенков серого (grayscale). Это позволяет использовать формат для хранения самых разных изображений, применяемых как для подготовки web-графики, так и в полиграфии.
Кроме изображения, в TIFF-файле могут сохраняться каналы прозрачности, позволяющие сохранять прозрачные области изображения или выделения объектов между сеансами работы.
Еще одна особенность формата TIFF — возможность сохранения нескольких изображений, имеющих собственные наборы атрибутов и свойств (тегов) в одном файле. Это делает TIFF похожим на формат GIF, но без возможности создания анимированных изображений.
Распространенность этого формата позволяет легко переносить изображения между программами и аппаратными платформами.
4. GIF
Этот формат файлов обладает небольшим размером и поддерживает простейшую анимацию, т.е. смена кадров в одном файле.
GIF имеет распространение в сфере создания баннеров, а также графической оболочки видеоконтента.
Основным преимуществом считается сжатие данных без явной потери качества при глубине до 256 цветов. Анимированные изображения состоят из некоторого числа статичных кадров и данных о требуемом времени демонстрации того или иного кадра.
Гиф-формат люди используют во многих сферах деятельности. Например, в оформлении собственных сайтов, в веб-дизайне, в графическом дизайне, во время написания статей или книг, в социальных сетях, в виде рекламных баннеров, для сохранения фото и так далее.
С помощью Gif-формата можно уменьшить объем картинки, что он очень хорошо влияет например, на скорость загрузки страниц сайта в Интернете.
5. SVG
Это уже векторный формат изображения. Если коротко, то при его помощи верстаются сайты. Он представляет собой текстовый файл XML, который наполнен тегами.
Данный формат не теряет качество изображения при масштабировании и кадрировании.
Более подробно о плюсах и минусах SVG разрешения, а также о его сохранении из Delphi можно посмотреть тут.
Теперь мы знаем, при каких условиях лучше использовать конкретный формат.
А как же можно будет сохранить эти форматы на Delphi / Lazarus?
Итак, нам нужно создать/сохранить/экспортировать из нашего известного Delphi файл будь то BMP или же GIF?
Для начала нам нужно создать документ. Обычный или сложный - без разницы.
Теперь после того, как набросали объект, который хотим перевести в иллюстрацию, запускаем и смотрим.
Вызвав предпросмотр выбираем нужный нам формат сохранения отчета.
Допустим, требуется экспорт в BMP image. Выбираем и нажимаем.
У нас всплывает окно, в котором присутствуют настройки экспорта документа. Настраиваем и сохраняем.
Немного о настройках.
Есть возможность сохранения всех страниц, текущей, на которой вы находитесь, ну или же указываете конкретные страницы.
Для сравнения настроек форматов привожу скриншоты: (TIFF, JPEG,GIF)
В некоторых вариантах некоторые настройки недоступны (особенности форматов):
Monochrome - изображения в оттенках черного;
Crop pages - обрезка страниц;
JPEG quality - настройка качества графического объекта;
Resolution (dpi) - разрешение в точках на дюйм;
Open after export - автоматическое открытие документа сразу же после сохранения.
Есть возможность сохранить файл в памяти ПК, загрузить в облако, передать по электронной почте или же в FTP.
Ну вот мы и освоили простое сохранение отчета в графические форматы из Delphi / C++Builder / Lazarus через интерфейс окна предварительного просмотра.
Но, а как же нам сохранить BMP/JPEG/TIFF/GIF из кода Delphi / C++Builder / Lazarus?
В 1988 году был принят первый международный стандарт сжатия неподвижных изображений. Он был назван по имени группы, которая над ним работала – JPEG (Joint Photographic Expert Group). Дело в том, что стандартные архиваторы (ZIP, ARJ) и традиционные алгоритмы сжатия в форматах GIF, TIFF и PCX не могут достаточно сильно сжать полутоновую или цветную картинку (типа фотографии) – максимум в 2-3 раза.
Примененный в JPEG алгоритм позволяет достичь сжатия в десятки раз – правда, при этом изображение подвергается необратимому искажению, и из него пропадает часть деталей. Бессмысленно (и вредно!) подвергать хранению в формате JPEG чертежи, рисунки, а также любые изображения с малым числом градаций – он предназначен именно для изображений фотографического качества.
Поддержка формата JPEG реализована в Delphi посредством класса TJPEGImage, который является потомком класса TGraphic.
Примечание
Название TJPEGImage не совсем удачное. К Timage этот класс не имеет ни малейшего отношения. Скорее, это "двоюродный брат" класса TBitmap.
К такому объекту предъявляются двоякие требования. С одной стороны, он должен поддерживать сжатие данных для записи на диск. С другой – распакованные данные в формате DIB, чтобы по требованию системы отрисовать их. Поэтому объект класса TJPEGimage может хранить оба вида данных, а также производить их взаимные преобразования, т. е. сжатие и распаковку. Для этого в нем предусмотрены методы:
Рекомендуется вызывать метод DIBNeeded заранее, перед отрисовкой картинки – это ускорит процесс ее вывода на экран.
Кроме того, полезно использовать метод Assign, который позволяет поместить в класс TJPEGimage объект TBitmap и наоборот:
При этом происходит преобразование форматов.
Свойства TJPEGimage можно условно разделить на две группы: используемые при сжатии и при распаковке.
Важнейшим из свойств, нужных при сжатии, является compressionQuality:
Оно определяет качество сжимаемого изображения и его размер. При малых значениях этого свойства файлы получаются очень маленькими, но с большими искажениями (напомним, что стандарт JPEG предусматривает сжатие с потерями качества). При значениях, близких к 100, потери незаметны, но и размер файла при этом максимален.
Примечание
Заранее предсказать размер сжатого файла нельзя – разные картинки сжимаются по-разному, даже при одном значении CompressionQuality.
По умолчанию значение этого свойства равно 75, что обеспечивает разумный компромисс между размером и качеством.
Кроме CompressionQuality, на качество отображения может повлиять и свойство:
Оно нужно только при распаковке и отвечает за способ восстановления цветовой палитры из сжатой информации. На качество записываемого изображения оно никак не влияет.
Как и у класса TBitmap, у TJPEGimage есть свойство:
Для рассматриваемого объекта возможных значений всего два – jf8bit и jf24bit. По умолчанию используется 24-битный формат. Если информация о цвете не нужна, то можно установить свойство Grayscale в значение True – в этом случае изображение будет записано (или распаковано) в полутоновом виде (256 оттенков серого).
Свойства ProgressiveEncoding и ProgressiveDisplay определяют способ показа изображения при распаковке. Первое из них отвечает за порядок записи в файл сжатых компонентов. Если ProgressiveEncoding установлено в значение True, начинает играть роль свойство ProgressiveDisplay. От его значения зависит, будет ли показываться изображение по мере распаковки (при значении True), либо будет сначала полностью распаковано, а потом показано (при значении False).
Чтобы организовать предварительный просмотр большого числа больших изображений, уместно воспользоваться свойством:
Искушенные в графике специалисты зададут вопрос: зачем оно? Ведь можно прочитать изображение, а затем уменьшить его масштаб стандартными способами? Представление информации в файлах JPEG таково, что можно достаточно просто извлечь изображение сразу в нужном масштабе. Таким образом достигается двойной выигрыш – на времени распаковки и на времени отображения.
Примечание
Печать растровых изображений может вызвать проблемы при согласовании его размеров с размерами листа принтера и его разрешением. Большую часть из них можно снять, изучив пример, поставляемый с Delphi – jpegProj. Он находится не в папке \Demos, как обычно, а в папке Help\Examples\Jpeg.
В заключение отметим, что класс TJPEGimage не имеет своей канвы для рисования – для этого его нужно преобразовать в классе TBitmap.
Читайте также: