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 安装 libwebkitgtk-1.0-0

    在 Ubuntu 上安装完 PDI 后启动 spoon.sh 时提示安装 libwebkitgtk-1.0-0.由于 apt 官方源中不包含此软件包,因此要添加该软件包的源,以及源对应的 gpg 公钥 ...

  2. 【Python】Selenium自动化测试之动态识别验证码图片方法(附静态图片文字获取)

    目录 一.前提 二.获取验证码 三.获取4位验证码 四.判断验证码是否正确 五.输入验证码登录 六.登录页面类 七.完整的获取验证码类代码 八.附录:静态图片文字提取 一.前提 返回目录 经常会遇到登 ...

  3. Java并发之原子变量及CAS算法-上篇

    Java并发之原子变量及CAS算法-上篇   概述 本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中式怎么保证变量原子性的呢?.对应Java中的包是:java.util.c ...

  4. 5个必知的高级SQL函数

    5个必知的高级SQL函数 SQL是关系数据库管理的标准语言,用于与数据库通信.它广泛用于存储.检索和操作数据库中存储的数据.SQL不区分大小写.用户可以访问存储在关系数据库管理系统中的数据.SQL允许 ...

  5. redis zset 使用场景

    前文,我们讨论过redis 的数据结构及使用场景.可参考: 参考: 总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景 https://www.cnblogs.com/yizhiamum ...

  6. Dell R920 服务器iDrac口默认账号密码和IP

    Dell服务器iDrac口默认账号密码和IP   账号:root 密码:calvin IP:192.168.0.120/24

  7. 合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务

    互联网.AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战.保护用户隐私及数据安全,是科技企业规范.健康发展的重心.近期,上海合合信息科技股份有限公司(简称"合合信 ...

  8. ASP.NET Core Library – Hangfire

    前言 以前写过 Hangfire 的学习笔记, 但写的很乱. 这篇做个整理. 介绍 Hangfire 是用来做 server task 的, 比如: background job, delay job ...

  9. KSM的使用

    使能KSM KSM只会处理通过madvise系统调用显式指定的用户进程地址空间,因此用户程序想使用这个功能就必须在分配地址空间时显式地调用madvise(addr,length,MADV_MERGEA ...

  10. 2022年12月中国数据库排行榜:OceanBase立足创新登榜首,华为腾讯排名上升树雄心

    不经一番寒彻骨,怎得梅花扑鼻香. 2022年12月的 墨天轮中国数据库流行度排行榜 火热出炉,本月共有249个数据库参与排名,相比上月新增3个数据库.本月排行榜前十用一句话可以概括为:榜单前十一片红, ...