Delphi 7和EMF+;文件夹

Delphi 7和EMF+;文件夹,delphi,gdi+,delphi-7,render,.emf,Delphi,Gdi+,Delphi 7,Render,.emf,我有一个应用程序,可以加载各种图形文件格式,如bmp、jpg、png、emf等。。。并渲染到屏幕上进行预览 我使用的是Delphi7。我刚刚介绍了在Windows XP时代创建的EMF+文件格式,该格式是使用GDIPlus.dll创建的。我可以用Windows Picture Viewer打开EMF+文件,图像质量非常高,可以放大和缩小而不产生任何模糊 问题是我似乎找不到一种方法(在Delphi7中)来打开这个文件格式并在屏幕上呈现它。有人知道Delphi 7中可用于呈现EMF+文件的代码示例或

我有一个应用程序,可以加载各种图形文件格式,如bmp、jpg、png、emf等。。。并渲染到屏幕上进行预览

我使用的是Delphi7。我刚刚介绍了在Windows XP时代创建的EMF+文件格式,该格式是使用GDIPlus.dll创建的。我可以用Windows Picture Viewer打开EMF+文件,图像质量非常高,可以放大和缩小而不产生任何模糊

问题是我似乎找不到一种方法(在Delphi7中)来打开这个文件格式并在屏幕上呈现它。有人知道Delphi 7中可用于呈现EMF+文件的代码示例或组件吗?

您可以使用具有EMF支持的“TMetaFileCanvas”。代码片段:

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);
编辑:

正如Marco善意地指出的那样,TMetaFileCanvas可能无法正确使用EMF+。还没有测试过,所以我不能确认

但似乎有一个单位与之合作

可从以下网址下载:


我还没有亲自检查过它,但它看起来适合这份工作。

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;

这是很普通的EMF,你确定它也有EMF+?Afaik Delphi在股票发行版中没有GDIplus组件我不确定,但Mitov软件的IGDI可能有emf+支持IGDI是一个免费的开源Delphi库: