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. Ubuntu 16.04 安装 python3.8

    Ubuntu 16.04  amd64 (64bit)(纯净版) 自带python2.7和python3.5 执行"whereis python"查看当前安装的python [ro ...

  2. Prism:框架介绍与安装

    Prism:框架介绍与安装 什么是Prism? Prism是一个用于在 WPF.Xamarin Form.Uno 平台和 WinUI 中构建松散耦合.可维护和可测试的 XAML 应用程序框架 Gith ...

  3. [深度学习] 时间序列分析工具TSLiB库使用指北

    TSLiB是一个为深度学习时间序列分析量身打造的开源仓库.它提供了多种深度时间序列模型的统一实现,方便研究人员评估现有模型或开发定制模型.TSLiB涵盖了长时预测(Long-term forecast ...

  4. mybatis-plus批量增加、批量修改样例+建表语句+postman接口

    使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是"新增"和"修改"方法是对一条数据进行处理的,如果有一万条数据就会和数据库 ...

  5. 【YashanDB数据库】Mybatis-plus分页框架识别不到Yashandb

    问题描述 Mybatis-plus 无法识别Yashandb数据库,应用有如下报错. 问题分析 从Mybatis-plus源码里面看到,getDBtype函数是没有Yashandb的方言. 当Yash ...

  6. 【效果】使用canvas rotate实现一个旋转的矩形

    使用canvas rotate实现一个旋转的矩形,并且以矩形的中心为原点,围绕原点旋转: <canvas id="canvas" width="800" ...

  7. 【Abyss】Android 平台应用级系统调用拦截框架

    Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环 -- SVC系统调用拦截. ☞ Github ☜ 由于我们虚拟化产品的需求,需要支持在普通的Android手机运行.我们 ...

  8. 5G网络架构的演进趋势

    5G网络架构的演进趋势 概述 5G移动通信网络系统包括5GC(5G Core Network,5G核心网)和NG-RAN(Next Generation Radio Access Network,5G ...

  9. Kubernetes Pod(Pod Hook?Pod 健康检查?Pod 资源配置?)(十八)

    一.Pod Hook 我们知道 Pod 是 Kubernetes 集群中的最小单元,而 Pod 是由容器组成的,所以在讨论 Pod 的生命周期的时候我们可以先来讨论下容器的生命周期.实际上 Kuber ...

  10. USB Type-C Power Role

    USB Power Role 是指 USB 设备在供电方面所扮演的角色,主要分为供电方(Provider)和受电方(Consumer).在 USB 供电协议中,电源角色的管理尤为重要,尤其是在 USB ...