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图形展示效果比浏览器展示的更好

欢迎微信搜一搜 IT软件部落 关注公众号,你可以了解更详细的内容

欢儿微信扫码关注 IT软件部落 公众号,你可以了解更详细的内容

delphi Image32 SVG图形查看器的更多相关文章

  1. SVG图形引用、裁切、蒙版

    SVG图形引用.裁切.蒙版,使用三个标签: 1. <use>标签创建图形引用 2. <clipPath>标签裁切图形 3. <mask>标签创建蒙版  ...

  2. jQuery 插件 Magnify 开发简介(仿 Windows 照片查看器)

    前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...

  3. jQuery 图片查看插件 Magnify 开发简介(仿 Windows 照片查看器)

    前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...

  4. Visual Studio图形调试器详细使用教程(基于DirectX11)

    前言 对于DirectX程序开发者来说,学会使用Visual Studio Graphics Debugger(图形调试器)可以帮助你全面了解渲染管线绑定的资源和运行状态,从而确认问题所在.现在就以我 ...

  5. react使用引入svg的icon;svg图形制作

    由于手头的icon有限,需要使用更多的图标,就得找外援: 1.react安装icon插件,使用插件里已经有的图标 https://react-icons.netlify.com/#/ React Ic ...

  6. 如何在pyqt中使用 QGraphicsView 实现图片查看器

    前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...

  7. RenderDoc图形调试器详细使用教程(基于DirectX11)

    前言 由于最近Visual Studio的图形调试器老是抽风,不得不寻找一个替代品了. 对于图形程序开发者来说,学会使用RenderDoc图形调试器可以帮助你全面了解渲染管线绑定的资源和运行状态,从而 ...

  8. 图模导入原理之 SVG图形基础与图形导入

    一.svg图形基础 PMS图形中,图形svg文件内容一般由两部分组成: 1.<defs>标签中定义的是图元信息,即各种不同设备不同状态的图元应该如何显示: 2.各种<XXXXXX_L ...

  9. Map工具系列-08-map控件查看器

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  10. wpf 仿QQ图片查看器

    参考博客 WPF下的仿QQ图片查看器 wpf图片查看器,支持鼠标滚动缩放拖拽 实现效果 主要参考的WPF下的仿QQ图片查看器,原博主只给出了部分代码. 没有完成的部分 1.右下角缩略图是原图不是缩略图 ...

随机推荐

  1. env 命令简介

    env 命令在 Unix 和 Unix-like 操作系统中,是用来运行一个指定的程序/命令,在执行时可以修改环境变量的一个工具.使用 env 可以启动任何指定的指令,并在这个指令的执行过程中设置或者 ...

  2. [Udemy] AWS Certified Data Analytics Specialty - 6.Security

    S3 加密 SSE-S3 SSE-KMS SSE-C Client Side Encryption SSL/TLS S3 支持http/https 两种协议 KMS KMS最大能加密4KB的数据,再大 ...

  3. .NET 8 + WPF 企业级工作流系统

    前言 推荐一款基于.NET 8.WPF.Prism.DryIoc.MVVM设计模式.Blazor以及MySQL数据库构建的企业级工作流系统的WPF客户端框架-AIStudio.Wpf.AClient ...

  4. 解决elementUI 表格el-table设置高度之后合计行不显示

    问题:elementUI el-table 设置了高度height 和合计行 show-summary 之后,合计行无法正常显示 一.问题分析 根据调试,发现该问题应该属于组件bug,表格主体中给 f ...

  5. ASP.NET Core Library – Nager.PublicSuffix

    前言 有个很简单的需求,想从 URL 里获取到 domain 不要 subdomain. abc.example.com -> example.com 没想到就这么简单的需求,超级难做.而且 . ...

  6. Let's Encrypt Free SSL – Certify The Web

    介绍 随着 Let's Encrypt 的普及. 现在为网站升级到 HTTPS 已经不需要付费了. Let's Encrypt 的 SSL 是免费的, 每 3 个月需要更新一次. 可以完全用 API ...

  7. SuperMap iServer数据动态更新刷新地图与数据服务

    更新:2022年6月27日 SuperMap iServer 11i 底层修改逻辑,增加智能指针.11i版本不需要以下操作即可实现 一.使用背景 有这么一个需求,后端也就通过SuperMap iDes ...

  8. Java日期时间API系列15-----Jdk8中java.time包中的新的日期时间API类,java日期计算2,年月日时分秒的加减等

    通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...

  9. iOS中UIlabel多行文本展示使用小结

    最近在项目开发中遇到了一个新的需求,就是菜单标题最多两行展示,一行展示的标签顶部和两行展示的标签顶部对齐.看到要求后,第一反应是这是什么奇葩的设计,但是没办法谁让别人是产品经理呢.细细思索后,代码如下 ...

  10. dotnet定义扩展方法

    // 扩展方法 // 1.创建静态类静态方法 2. 在静态方法中参数中使用 this 关键字指定需要扩展的类 // 密封类 不能直接继承,通过扩展方法,拿到父类的属性和方法进行扩展补充