Delphi 7 и EMF + файлы - PullRequest
       35

Delphi 7 и EMF + файлы

3 голосов
/ 21 апреля 2010

У меня есть приложение, которое может загружать различные графические форматы файлов, такие как bmp, jpg, png, emf и т. Д., И выводить их на экран для предварительного просмотра.

Я использую Delphi 7. Я только что познакомился с форматом файлов EMF +, который был создан во время Windows XP, созданной с использованием GDIPlus.dll.Я могу открыть файлы EMF + с помощью Windows Picture Viewer, и изображение имеет очень высокое качество и может увеличивать и уменьшать масштаб изображения без какого-либо размытия вообще.

Проблема в том, что я не могу найти способ (в Delphi 7) открыть этот формат файла и отобразить его на экране.Кто-нибудь знает пример кода или компонент, который можно использовать в Delphi 7 для рендеринга файла EMF +?

Ответы [ 2 ]

4 голосов
/ 04 мая 2010

TMetaFileCanvas не будет работать правильно с EMF +, но ваша задача может быть выполнена с помощью GDI +.

Вот пример кода, который демонстрирует, как это сделать с помощью GDI +:

type
  PGdiplusStartupInput = ^TGdiplusStartupInput;
  TGdiplusStartupInput = record
    GdiplusVersion: Integer;
    DebugEventCallback: Integer;
    SuppressBackgroundThread: Integer;
    SuppressExternalCodecs: Integer;
  end;

function GdiplusStartup(var Token: Integer; InputBuf: PGDIPlusStartupInput; OutputBuf: Integer): Integer; stdcall; external 'gdiplus.dll';
procedure GdiplusShutdown(Token: Integer); stdcall; external 'gdiplus.dll';
function GdipCreateFromHDC(DC: HDC; var Graphics: Integer): Integer; stdcall; external 'gdiplus.dll';
function GdipDeleteGraphics(Graphics: Integer): Integer; stdcall; external 'gdiplus.dll';
function GdipLoadImageFromFile(Filename: PWChar; var GpImage: Integer): Integer; stdcall; external 'gdiplus.dll';
function GdipDrawImageRect(Graphics, Image: Integer; X, Y, Width, Height: Single): Integer; stdcall; external 'gdiplus.dll';

procedure LoadEMFPlus(const FileName: WideString; DC: HDC; Width, Height: Integer);
var
  Token: Integer;
  StartupInput: TGdiplusStartupInput;
  Graphics: Integer;
  Image: Integer;
begin
  StartupInput.GdiplusVersion := 1;
  StartupInput.DebugEventCallback := 0;
  StartupInput.SuppressBackgroundThread := 0;
  StartupInput.SuppressExternalCodecs := 0;
  if GdiplusStartup(Token, @StartupInput, 0) = 0 then
  begin
    if GdipCreateFromHDC(DC, Graphics) = 0 then
    begin
      if GdipLoadImageFromFile(@FileName[1], Image) = 0 then
      begin
        GdipDrawImageRect(Graphics, Image, 0, 0, Width, Height);
      end;
      GdipDeleteGraphics(Graphics);
    end;
    GdiplusShutdown(Token);
  end;
end;

И вы можете назвать это так:

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadEMFPlus('EMFTest.emf',
    PaintBox1.Canvas.Handle, PaintBox1.Width, PaintBox1.Height);
end;
3 голосов
/ 22 апреля 2010

Вы можете использовать «TMetaFileCanvas» с поддержкой EMF. Фрагмент кода:

procedure TForm1.Button1Click(Sender: TObject);
var  
  MyMetaFile: TMetaFile;  
  MyCanvas: TMetafileCanvas;
begin
  MyMetaFile:= TMetaFile.Create;
  try
    MyMetaFile.LoadFromFile('C:\example.emf');

    MyCanvas:= TMetafileCanvas.Create(MyMetaFile, 0);
    try
      MyCanvas.Draw(0, 0, MyMetaFile);
      MyCanvas.Pen.Color:= clRed;
      MyCanvas.MoveTo(0, 0);
      MyCanvas.LineTo(100, 100);
      MyCanvas.Free;

      Image1.Canvas.Draw(0, 0, MyMetaFile);
    finally
      MyCanvas.Free;
    end;

    MyMetaFile.SaveToFile('C:\example.emf');
  finally
    MyMetaFile.Free;
  end;
end;

Таким образом, вы можете загрузить EMF, нарисовать в EMF и сохранить его. Но представить его как векторную графику от Delphi - это еще одна проблема. Delphi хорошо работает только с растровой графикой из коробки. Но, насколько я понимаю, вы только хотите прочитать и нарисовать это. Например, чтобы преобразовать его в BMP, вы можете сделать:

// destroy canvas to transfer the image into the metafile object
FreeAndNil(MyCanvas);
// draw image as normal graphic
BMP.Canvas.Draw(0, 0, MyMetaFile);

EDIT:

Как любезно отметил Марко, TMetaFileCanvas, вероятно, не будет правильно работать с EMF +. Я не проверял это, поэтому я не могу подтвердить это.

Но, похоже, есть устройство, которое работает с этим.

http://blog.synopse.info/post/2010/04/02/Antialiased-drawing-from-TMetaFile

Скачать можно с:

http://synopse.info/files/SynGdiPlus.zip

Сам не проверил, но это выглядит подходящим для работы.

...