首页 > 其他分享 >delphi Image32 SVG图形查看器

delphi Image32 SVG图形查看器

时间:2024-06-13 23:11:47浏览次数:13  
标签:end ImagePanel 查看器 ListBox1 SVG delphi filename procedure Sender

DELPHI 中没有SVG显示组件,需要用到第三方组件,高版本可以使用skia(但必须带上skia.dll).

最新版Image32修改了很多,SVGIconImageList 也因此换成了Image32做为基础库,安装了 SVGIconImageList 就可以不用再单独安装 Image32了(基本上是绿色不用安装包,直接引用就行)。

unit uFrmSVGShow;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus,
  Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls, Img32.Panels, Vcl.Buttons;

type
  TfrmSVGShow = class(TForm)
    Splitter1: TSplitter;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    PopupMenu1: TPopupMenu;
    mnuOpenInTextEditor: TMenuItem;
    mnuOpenInBrowser: TMenuItem;
    SaveDialog1: TSaveDialog;
    Panel1: TPanel;
    btnSave: TSpeedButton;
    btnOpen: TSpeedButton;
    btnOpenSVGText: TSpeedButton;
    btnOpenBrowser: TSpeedButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnOpenClick(Sender: TObject);
    procedure mnuOpenInTextEditorClick(Sender: TObject);
    procedure mnuOpenInBrowserClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    procedure ImagePanelResize(Sender: TObject);
    procedure ListSVGFilesInFolder;
  protected
    folder: string;
    filename: string;
    ImagePanel: TImage32Panel;
    procedure OpenFile(const filename: string);
    procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
    procedure DrawCurrentItem;
  end;

var
  frmSVGShow: TfrmSVGShow;

implementation

{$R *.dfm}

uses
  Winapi.ShellAPI, Winapi.ShLwApi, //
  System.Math, System.IOUtils, Img32, Img32.Vector, Img32.Draw, Img32.Fmt.PNG,
  Img32.Fmt.JPG, Img32.Fmt.SVG, Img32.Text;

procedure OpenDocument(const filename: string);
begin
  //默认程序打开
  ShellExecute(0, 'open', PChar(filename), nil, nil, SW_SHOWNORMAL);
end;

function GetDefaultTextEditor: string;
var
  exeFileBuffer: array[0..1024] of char;
  len: DWORD;
begin   //查找系统中注册的 .txt 默认打开程序
  len := 1024;
  if AssocQueryString(0, ASSOCSTR_EXECUTABLE, '.txt', nil, @exeFileBuffer[0], @len) = S_OK then
    SetString(Result, exeFileBuffer, len - 1)
  else
    Result := '';
end;

procedure OpenDocumentWithDefaultTxt(const filename: string);
var
  txtEditor: string;
begin
  txtEditor := GetDefaultTextEditor;
  ShellExecute(0, 'open', PChar(txtEditor), PChar('"' + filename + '"'), nil, SW_SHOWNORMAL);  //返回>32  表示句柄
end;

{ TfrmSVGShow }

procedure TfrmSVGShow.btnOpenClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
    OpenFile(OpenDialog1.filename);
end;

procedure TfrmSVGShow.btnSaveClick(Sender: TObject);
begin
  if SaveDialog1.Execute then
    ImagePanel.Image.SaveToFile(SaveDialog1.filename);
end;

procedure TfrmSVGShow.DrawCurrentItem;
var
  svgFilenameAndPath: string;
  rec: TRect;
begin
  if ListBox1.ItemIndex < 0 then
    Exit;

  filename := ListBox1.Items[ListBox1.ItemIndex];
  svgFilenameAndPath := TPath.Combine(folder, filename);
  rec := ImagePanel.InnerClientRect;

  ImagePanel.Image.BeginUpdate;
  Screen.Cursor := crHourGlass;
  try
    ImagePanel.Image.SetSize(RectWidth(rec), RectHeight(rec));
    ImagePanel.Image.LoadFromFile(svgFilenameAndPath);   //加载文件(支持 .svg)
  finally
    ImagePanel.Image.EndUpdate;
    Screen.Cursor := crDefault;
  end;
//  ActiveControl := ListBox1;
end;

procedure TfrmSVGShow.FormCreate(Sender: TObject);
var
  rec: TRect;
begin
  Self.BorderStyle := bsNone;

  ImagePanel := TImage32Panel.create(self);
  ImagePanel.BorderWidth := 0;     //默认有一个大的边框,这里设置后可去掉边框。
  ImagePanel.BorderStyle := bsNone;
  ImagePanel.BevelOuter := bvNone;
  ImagePanel.parent := self;
  ImagePanel.Align := alClient;
  ImagePanel.OnResize := ImagePanelResize;
  ImagePanel.BkgType := pbtChessBoard;
//  DragAcceptFiles(Handle, True);   //允许拖曳文件到窗口 (窗体做为其它窗口的子对象时,此外的Handle可能会再次创建而发生变化,要放到Show中)
  ImagePanel.ParentBackground := false;
  ImagePanel.Color := clBtnFace;
  rec := ImagePanel.InnerClientRect;
  ImagePanel.Image.SetSize(RectWidth(rec), RectHeight(rec));

  // FontManager.Load('Segoe UI');   //要加载一些字体,svg文件中可能指定了字体,如果不加载,svg中的文字不会显示

  //win10 下可以从 打开字体预览 (窗口标题栏显示的为字体名称,并非完全是预览内容中的 字体名称)

  FontManager.Load('Arial Bold');
  FontManager.Load('Arial Italic');
  FontManager.Load('Arial Bold Italic');
  FontManager.Load('Times New Roman');
  FontManager.Load('Times New Roman Bold');
  FontManager.Load('Times New Roman Italic');
  FontManager.Load('Times New Roman Bold Italic');

  FontManager.Load('Symbol');
  FontManager.Load('Webdings');
  FontManager.Load('Wingdings');
  FontManager.Load('Segoe UI Symbol');

  OpenFile('.\SVGs\textpath2.svg');
  // OpenFile('.\*.svg');
  ListSVGFilesInFolder;
  DrawCurrentItem;

end;

procedure TfrmSVGShow.FormDestroy(Sender: TObject);
begin
  ImagePanel.Free;
  DragAcceptFiles(Handle, false);    //不允许拖曳到窗口
end;

procedure TfrmSVGShow.FormShow(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);   //允许拖曳文件到窗口
end;

procedure TfrmSVGShow.ImagePanelResize(Sender: TObject);
var
  rec: TRect;
begin
  rec := ImagePanel.InnerClientRect;
  ImagePanel.Image.SetSize(RectWidth(rec), RectHeight(rec));
  DrawCurrentItem;
end;

procedure TfrmSVGShow.ListBox1Click(Sender: TObject);
begin
  DrawCurrentItem;
end;

procedure TfrmSVGShow.ListSVGFilesInFolder;
var
  sr: TSearchRec;
  i, idx, searchResult: integer;
begin  //将文件列表,显示在 ListBox中
  ListBox1.Items.BeginUpdate;
  try
    ListBox1.Items.Clear;
    searchResult := FindFirst(TPath.Combine(folder, '*.svg'), faAnyFile, sr);    //查找 文件
    idx := -1;
    while searchResult = 0 do
    begin
      if sr.Name[1] = '.' then
        Continue;
      i := ListBox1.Items.Add(sr.Name);
      if sr.Name = filename then
        idx := i;
      searchResult := FindNext(sr);      //查找 下一个
    end;
    ListBox1.Visible := ListBox1.Items.Count > 0;
    if not ListBox1.Visible then
      Exit;
    idx := Max(0, idx);
    ListBox1.ItemIndex := idx;
  finally
    ListBox1.Items.EndUpdate;
  end;
end;

procedure TfrmSVGShow.mnuOpenInBrowserClick(Sender: TObject);
var
  fn: string;
begin      //默认程序打开
  if ListBox1.ItemIndex < 0 then
    Exit;
  fn := TPath.Combine(folder, ListBox1.Items[ListBox1.ItemIndex]);
  OpenDocument(PChar(fn));
end;

procedure TfrmSVGShow.mnuOpenInTextEditorClick(Sender: TObject);
var
  fn: string;
begin    //文本编辑器打开
  if ListBox1.ItemIndex < 0 then
    Exit;
  fn := TPath.Combine(folder, ListBox1.Items[ListBox1.ItemIndex]);
  OpenDocumentWithDefaultTxt(fn);
end;

procedure TfrmSVGShow.OpenFile(const filename: string);
var
  i: integer;
begin
  self.filename := ExtractFileName(filename);
  folder := ExtractFilePath(filename);
  if (folder = '') or (folder[1] = '.') then
    folder := ExpandFileName(folder);  //如果是相对路径,展开成完整绝对路径
  OpenDialog1.InitialDir := folder;
  ListSVGFilesInFolder;
  i := ListBox1.Items.IndexOf(self.filename);
  if i <> ListBox1.ItemIndex then
    ListBox1.ItemIndex := i
  else
    DrawCurrentItem;
end;

procedure TfrmSVGShow.WMDropFiles(var Msg: TMessage);
var
  hDrop: THandle;
  filenameLen: integer;
  filename: string;
begin   //拖曳文件过来,打开
  Msg.Result := 0;
  hDrop := Msg.wParam;
  filenameLen := DragQueryFile(hDrop, 0, nil, 0);
  SetLength(filename, filenameLen);
  DragQueryFile(hDrop, 0, Pointer(filename), filenameLen + 1);
  DragFinish(hDrop);
  OpenFile(filename);
end;

end.

有些svg图形展示效果比浏览器展示的更好

 

标签:end,ImagePanel,查看器,ListBox1,SVG,delphi,filename,procedure,Sender
From: https://www.cnblogs.com/bluejade/p/18246937

相关文章

  • delphi Image32 图形处理 图层
    图形图层处理是Image32的主要功能,矢量图形,分层类似Photoshop看人图层,直接上代码效果。unituFrmLayer;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Types,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,V......
  • delphi Image32 路径
    用Image32的理由之一,也是路径这块做得比delphi(FMX)自带的要好,skia中支持svg,但对路径处理功能不够强大。VCL只能使用第三方库。VCL如果要支持SVG,只有Image32好点,SVGIconImageList 第三方库也使用Image32.  unituFrmPaths;interfaceusesWinapi.Windows,Winapi.M......
  • C#如何查看/写入日志到Windows事件查看器
    Windows事件日志Windows操作系统将与计算机的系统性能、应用程序和安全方面相关的每个事件记录在C:\WINDOWS\system32\winevt的日志中。事件查看器从这些原始事件日志中读取信息,然后以可读格式呈现信息。打开Windows事件查看器的方法是1、运行输入eventvwr2、Windows+X打......
  • 窥探 Delphi 的 dcp文件
    之前我猜测Delphi里的dcp类似java里的maven的pom.xml,经过测试发现,和猜想的才不多,既包含了pom.xml的信息,又包含了本bpl的信息;测试如下:在本文中,我将展示如何从Delphi的DCP文件中读取一些非常基本的信息。这包括要链接的BPL名称、所需的DCP和包含的单元。在过去的......
  • TSkSvg组件使用
    1.把svg静态字符串写死程序里unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,System.Skia,Vcl.Skia,Vcl.StdCtrls;typeTForm1=class(T......
  • 导出 LaTeX 为 SVG
    LaTeX本身并不直接支持导出SVG格式的文档或图片,但可以通过一些工具和插件实现将LaTeX文档或图形转换为SVG格式。使用dvisvgm我们可以先将LaTeX文档编译为DVI格式,再通过dvisvgm工具将DVI文件转换为SVG格式。这个工具是TeXLive发行版的一部分。编译为DVI......
  • Spire.PDF for Java 10.6.0 支持 PDF to SVG, Word and OFD
    Spire.PDFforJava10.6.0enhancestheconversionsfromPDFtoSVG,WordandOFDSpire.DocforJavaisaprofessionalWordAPIthatempowersJavaapplicationstocreate,convert,manipulateandprintWorddocumentswithoutdependencyonMicrosoftWord.B......
  • delphi property中default的含义
    delphiproperty中default的含义首先看个案例TPerson=classpublishedpropertyAge:IntegerreadFAgewriteSetAgedefault20;end;我们创建一个TPerson类给其一个属性,然后使用了default20关键字,按照我们的理解应该是这个age属性的默认值就是20;其实这个d......
  • 界面控件Telerik UI for WPF中文教程 - 用RadSvgImage升级应用程序UI
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。TelerikUIforWPF中的RadSvgImage组件使......
  • 【SVG 生成系列论文(九)】如何通过文本生成 svg logo?IconShop 模型推理代码详解
    SVG生成系列论文(一)和SVG生成系列论文(二)分别介绍了StarVector的大致背景和详细的模型细节。SVG生成系列论文(三)和SVG生成系列论文(四)则分别介绍实验、数据集和数据增强细节。SVG生成系列论文(五)介绍了从光栅图像(如PNG、JPG格式)转换为矢量图形(如SVG、EPS格式)的关......