加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi 7和EMF文件

发布时间:2020-12-15 09:06:36 所属栏目:大数据 来源:网络整理
导读:我有一个应用程序可以加载各种图形文件格式,如bmp,jpg,png,emf等…并将它们渲染到屏幕上进行预览. 我正在使用Delphi 7.我刚刚介绍了使用GDIPlus.dll创建的Windows XP时创建的EMF文件格式.我可以使用Windows Picture Viewer打开EMF文件,图像质量非常高,可以放
我有一个应用程序可以加载各种图形文件格式,如bmp,jpg,png,emf等…并将它们渲染到屏幕上进行预览.

我正在使用Delphi 7.我刚刚介绍了使用GDIPlus.dll创建的Windows XP时创建的EMF文件格式.我可以使用Windows Picture Viewer打开EMF文件,图像质量非常高,可以放大和缩小而不会有任何模糊.

问题是我似乎无法找到一种方法(在Delphi 7中)打开这种文件格式并在屏幕上呈现它.有没有人知道可以在Delphi 7中使用的代码示例或组件来呈现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,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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读