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. 使用go+gin编写日志中间,实现自动化收集http访问信息,错误信息等,自动化生成日志文件

    1.首先在logger包下 点击查看代码 package logger import ( "fmt" "io" "net/http" &qu ...

  2. c++字符编码转换

    c++字符编码转换 简述 字符编码一直是软件开发中很麻烦的问题.当前项目开发普遍使用的字符集是utf-8,而windows系统则默认是gbk,linux默认编码则是utf-8,所以想要开发一个在win ...

  3. Python存储与读写二进制文件

    技术背景 一般情况下我们会选择使用明文形式来存储数据,如json.txt.csv等等.如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式.还有一种比较紧凑的数据存储格式,就是直接按 ...

  4. 小程序bindinput和bindblur赋值延迟问题解决

    小程序bindinput和bindblur赋值延迟问题解决 问题链接:https://developers.weixin.qq.com/community/develop/doc/000a0ebdc4 ...

  5. 十五,Spring Boot 整合连接数据库(详细配置)

    十五,Spring Boot 整合连接数据库(详细配置) @ 目录 十五,Spring Boot 整合连接数据库(详细配置) 最后: JDBC + HikariDataSource(Spring Bo ...

  6. tailwindcss 3.3.3(完成入门,需要补充每个单独样式)

    归纳 修饰符堆叠 <button class="dark:md:hover:bg-fuchsia-600"> 以下为修饰符 伪类伪元素 使用方法: 在实用程序类前添加h ...

  7. @RequestBody注意事项

    使用@RequestBody注解时,是用于接收Content-Type为application/json类型的请求,数据类型是JSON:{"aaa":"111" ...

  8. 关于 B 先生

    B 先生是不是要疯了,他今天说的都是他妈什么几把

  9. [OI] 莫比乌斯函数与莫比乌斯反演

    9. 莫比乌斯函数与莫比乌斯反演 9.1 莫比乌斯函数 9.1.1 定义 设 \(\mu\) 为莫比乌斯函数,则有: \[\mu(x)=\begin{cases}1\qquad (n=1)\\ 0\q ...

  10. 原生CSS、HTML 和 JavaScript 实现酷炫表单

    一直使用 Vue/React ,习惯了用组件,偶尔想用原生三剑客写点 Demo 发现样式丑的不忍直视.最近看 掘金小册<玩转CSS的艺术之美>看到 CSS 相关的内容,发现原生 CSS 也 ...