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. IE中在线预览PDF文件

    今天在项目中偶然遇到一个需要在线查看pdf的需求.在查阅一些资料之后使用了最简单的写法(需要在客户端安装AdbeRdr11000_zh_CN_11.0.0.379.exe软件). 还有其他方法可以实现 ...

  2. draw.io 输入数学公式

    首先我们要把数学排版功能打开: 然后输入数学公式: AsciiMath 公式由 ` 包裹,如:`a2+b2 = c^2` LaTeX 公式由 $$ 包裹,如:$$\sqrt{3×-1}+(1+x)^2 ...

  3. 网络安全公开数据集Maple-IDS,恶意流量检测数据集开放使用!

    Maple Dataset 枫叶数据集Maple Dataset枫叶数据集由东北林业大学网络安全实验室(https://maple.nefu.edu.cn/lab/)公开发布,是用于入侵检测评估的数据 ...

  4. 【YashanDB知识库】收集分区表统计信息采样率小于1导致SQL执行计划走偏

    [问题分类]性能优化,BUG [关键字]分区表,统计信息,采样率 [问题描述]收集表(分区表)级别的统计信息时,如果采样率小于1,dba_ind_statistics中partition_name i ...

  5. zabbix-server无法启动

    部署:Zabbix-(1)安装 - xiao智 - 博客园 (cnblogs.com) 故障现象: 监控界面状态为 "否" 1.服务状态果然报错了 ,报错提示是被退出的 2.net ...

  6. Codeforces Round 973 (Div. 2) C

    #include <bits/stdc++.h> using namespace std; int T; int n; struct edge { int pre; int nxt; in ...

  7. Java在线数据导入导出Excel

    利用hutool 导入导出 Excel 导入maven <dependency> <groupId>cn.hutool</groupId> <artifact ...

  8. WiFi基础(五):802.11帧结构与WiFi控制帧、管理帧、数据帧

    liwen01 2024.09.22 前言 前面介绍了 WiFi 的工作原理和 WiFi 的接入过程,这里将通过分析 WiFi 具体数据包结构,让你对 WiFi 工作原理和接入过程有一个更进一步的了解 ...

  9. 1. 王道OS-操作系统的概念、功能

    1. 操作系统是指控制和管理整个计算机的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配:以提供给用户和其他软件方便的接口和环境:他是计算机系统最基本的系统软件: 操作系统需要向其他软件提供服 ...

  10. spring boot 官网提供所有组件

    所有资源来自于官网:https://start.spring.io/,在此整理只是为了方便查看 Developer Tools Spring Boot DevToolsProvides fast ap ...