image32中有2种算法转换图像为svg,一种是按透明度计算找边缘,另一种是分析像素梯度找边缘,demo代码整理后如下:

unit uFrmImageToSVG;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus,
Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls, //
Img32, uSvgWriter; type
TfrmImageToSVG = class(TForm)
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Panel1: TPanel;
btnOpen: TSpeedButton;
btnSaveAs: TSpeedButton;
rbRasterImage: TRadioButton;
rbRasterVectors: TRadioButton;
rbSmoothedAndSimplified: TRadioButton;
ckbHighlightVertices: TCheckBox;
pnlSmooth: TPanel;
lblSmooth: TLabel;
lblSimplify: TLabel;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
PaintBox1: TPaintBox;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure TrackBarChange(Sender: TObject);
procedure RadioOnClick(Sender: TObject);
procedure ckbHighlightVerticesClick(Sender: TObject);
procedure btnSaveAsClick(Sender: TObject);
private
masterImg, workImg: TImage32;
hasTransparency: Boolean; // must be checked before resizing
rawPaths, bezierPaths, smoothedPaths: TPathsD;
function GetDisplaySize: TSize;
procedure DisplayImage;
public
{ Public declarations }
end; var
frmImageToSVG: TfrmImageToSVG; implementation {$R *.dfm}
{$R Image2.res} uses
Winapi.ShellAPI, System.Math, //
Img32.Draw, Img32.Vector, Img32.Extra, Img32.Vectorizer, Img32.Fmt.BMP,
Img32.Fmt.JPG, Img32.Fmt.PNG; const
C_Margin = 20; function Count(const paths: TPathsD): integer;
var
i: integer;
begin // 统计路径中有多少个点
Result := 0;
for i := 0 to High(paths) do
inc(Result, Length(paths[i]));
end; procedure TfrmImageToSVG.btnOpenClick(Sender: TObject);
begin // 打开图像
if not OpenDialog1.Execute then
Exit;
masterImg.LoadFromFile(OpenDialog1.FileName);
hasTransparency := masterImg.hasTransparency; // 打开的图像是否透明.
masterImg.ScaleToFit(1000, 1000); // 图像缩放到指定尺寸
DisplayImage; // 重新计算图像
end; procedure TfrmImageToSVG.btnSaveAsClick(Sender: TObject);
begin // 保存为
SaveDialog1.InitialDir := OpenDialog1.InitialDir;
SaveDialog1.FileName := ChangeFileExt(ExtractFileName(OpenDialog1.FileName), '.svg');
if not SaveDialog1.Execute then
Exit; with TSimpleSvgWriter.Create(frEvenOdd) do // SVG 写对象
try
AddPaths(smoothedPaths, false, $40000033, $FF000033, 1.2); // 后3个参数为 填充颜色,边线颜色,连线宽度
SaveToFile(SaveDialog1.FileName, 800, 600); // 保存 SVG,参数:文件名,最大宽度,最大高度,边缘宽度[不指定(默认20)]
finally
free;
end;
ShellExecute(0, 'open', PChar(SaveDialog1.FileName), nil, nil, SW_SHOW); // 保存完成后,使用默认程序打开 svg
StatusBar1.Panels[1].Text := format(' %s saved.', [ExtractFileName(SaveDialog1.FileName)]);
end; procedure TfrmImageToSVG.ckbHighlightVerticesClick(Sender: TObject);
begin // 高亮显示顶点 变化 ,重新计算绘制
DisplayImage;
end; procedure TfrmImageToSVG.DisplayImage;
var
i, j: integer;
scale, simplifyTol: double;
vectorBounds: TRect;
// tmpColors: TArrayOfColor32;
begin
rawPaths := nil;
bezierPaths := nil;
smoothedPaths := nil; PaintBox1.Invalidate; if masterImg.IsEmpty then
Exit; if rbRasterImage.Checked then //光栅图像
begin
workImg.Assign(masterImg); // shows the raw image only
with GetDisplaySize do
workImg.ScaleToFit(cx - C_Margin * 2, cy - C_Margin * 2);
// // otherwise, show as a monochrome image
// tmpColors := GetColorMask(workImg, clBlack32, CompareRGB, $32);
// Move(tmpColors[0], workImg.Pixels[0], Length(tmpColors) * SizeOf(TColor32));
StatusBar1.Panels[0].Text := '';
StatusBar1.Panels[1].Text := ' Raw raster image';
Exit;
end; with GetDisplaySize do
workImg.SetSize(cx, cy);
if rbRasterVectors.Checked then //光栅矢量
simplifyTol := 0
else //平滑简化
simplifyTol := TrackBar2.Position * 0.5; //简化容差 (TrackBar2.Position 最大值为 10) // 1. Vectorize (now includes vector simplification):converts simple (2 color) raster images into vector images
// 矢量化(现在包括矢量简化):将简单(2色)光栅图像转换为矢量图像
if hasTransparency then
rawPaths := Vectorize(masterImg, $FF000000, CompareAlpha, $80, simplifyTol) //透明度对比 矢量化 $80:颜色容差 simplifyTol:简化容差
else
rawPaths := Vectorize(masterImg, $FF000000, CompareRGB, $44, simplifyTol); //颜色值对比 矢量化 $44:颜色容差 simplifyTol:简化容差 vectorBounds := GetBounds(rawPaths); //获取路径区域
if vectorBounds.IsEmpty then
Exit; // offset and scale the vector image 偏移和缩放矢量图像 rawPaths := TranslatePath(rawPaths, C_Margin - vectorBounds.Left, C_Margin - vectorBounds.Top); //平移图像(留出边缘距离) // 实际大小与显示大小,计算合适的缩放比
scale := Min((workImg.Width - C_Margin * 2) / RectWidth(vectorBounds), (workImg.Height - C_Margin * 2) / RectHeight(vectorBounds));
rawPaths := ScalePath(rawPaths, scale); //缩放路径 if rbRasterVectors.Checked then //光栅矢量
begin
smoothedPaths := rawPaths;
StatusBar1.Panels[0].Text := format(' Vertices: %d', [Count(rawPaths)]);
StatusBar1.Panels[1].Text := ' Raw Vectors (no smoothing or simplification)';
end
else
begin //平滑简化
smoothedPaths := SmoothPaths(rawPaths, true, (10 - TrackBar1.Position) / 10, 0.25); //参数2:路径闭合 参数3:张力(决定平滑度) 参数4:形状公差
lblSmooth.Caption := format('Smooth'#10'Amount'#10'(%d)', [TrackBar1.Position]); //平滑度 TrackBar1最大值为10
lblSimplify.Caption := format('Simplify'#10'Amount'#10'(%d)', [TrackBar2.Position]); //差化容差
StatusBar1.Panels[0].Text := format(' Vertices: %d', [Count(smoothedPaths)]);
StatusBar1.Panels[1].Text := ' Simplified & smoothed';
end; if ckbHighlightVertices.Checked then //高亮显示顶点
begin
DrawPolygon(workImg, smoothedPaths, frEvenOdd, $20660000); //绘制多边开
DrawLine(workImg, smoothedPaths, DPIAware(2), clMaroon32, esPolygon); //绘制多边开连线
for i := 0 to High(smoothedPaths) do
for j := 0 to High(smoothedPaths[i]) do
DrawPoint(workImg, smoothedPaths[i][j], DPIAware(2.5), clNavy32); //绘制多边形顶点
end
else
begin
DrawPolygon(workImg, smoothedPaths, frEvenOdd, $FF660033); //绘制多边开
end; end; procedure TfrmImageToSVG.FormCreate(Sender: TObject);
begin
self.BorderStyle := bsNone;
//
masterImg := TImage32.Create;
masterImg.LoadFromResource('beetle', 'PNG'); // 从资源中加载图片.
hasTransparency := masterImg.hasTransparency; // 是否透明
masterImg.ScaleToFit(1000, 1000); // 调整到指定尺寸
OpenDialog1.InitialDir := ExtractFilePath(paramStr(0)) + 'sample_images'; // 样办图片位置
ForceDirectories(OpenDialog1.InitialDir);
OpenDialog1.FileName := 'book.bmp';
if hasTransparency then
masterImg.CropTransparentPixels; // 裁剪透明像素
workImg := TImage32.Create;
end; procedure TfrmImageToSVG.FormDestroy(Sender: TObject);
begin
masterImg.free;
workImg.free;
end; procedure TfrmImageToSVG.FormResize(Sender: TObject);
begin
if not(csDestroying in ComponentState) then
begin
Invalidate;
DisplayImage; // 重新计算绘制
end;
end; function TfrmImageToSVG.GetDisplaySize: TSize;
begin
Result.cx := PaintBox1.ClientWidth; // ClientWidth - pnlSmooth.Width;
Result.cy := PaintBox1.ClientHeight; // ClientHeight - StatusBar1.Height;
end; procedure TfrmImageToSVG.PaintBox1Paint(Sender: TObject);
begin
workImg.CopyToDc(PaintBox1.Canvas.Handle); // 绘制到 PaintBox
end; procedure TfrmImageToSVG.RadioOnClick(Sender: TObject);
begin // 切换不同的显示模式
pnlSmooth.Visible := Sender = rbSmoothedAndSimplified;
if pnlSmooth.Visible then
TrackBar1.SetFocus;
DisplayImage; // 重新计算绘制
end; procedure TfrmImageToSVG.TrackBarChange(Sender: TObject);
begin // 简化 及 平整 发生变化
DisplayImage; // 重新计算绘制
end; end.

效果如下:

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

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

delphi Image32 图片转换成SVG的更多相关文章

  1. FilterFactory是一款将图片转换成SVG的在线生成工具。

    FilterFactory是一款将图片转换成SVG的在线生成工具. FilterFactory 彩蛋爆料直击现场 FilterFactory是一款将图片转换成SVG的在线生成工具.

  2. delphi将图片转换成Base64编码函数

    {************************************************************************** 名称: BaseImage 参数: fn: TF ...

  3. 使用CSS将图片转换成黑白(灰色、置灰)z转

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

  4. 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果

    去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...

  5. [转] 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果 ---张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3804 去年盛夏之时, ...

  6. 小tip: 使用CSS将图片转换成黑白(灰色、置灰)[转]

        小tip: 使用CSS将图片转换成黑白(灰色.置灰) 这篇文章发布于 2012年08月19日,星期日,20:41,归类于 css相关, SVG相关. 阅读 159943 次, 今日 146 次 ...

  7. [转]C#将image中的显示的图片转换成二进制

    本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...

  8. ABBYY如何把图片转换成pdf格式

    在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...

  9. C#将image中的显示的图片转换成二进制

    原文:C#将image中的显示的图片转换成二进制 1.将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才 ...

  10. 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

随机推荐

  1. 【Python + Appium】之元素定位总结(更新)

    一.ID定位 uiautomatorviewer里面的:resource-id driver.find_element(By.ID,"com.csks.businesses:id/tv_nu ...

  2. Playwright 源码 BrowserType

    playwright-java 的 Browser.BrowserContext.Page 挺好理解的,唯独这厮,就有一丢丢 -- package com.microsoft.playwright; ...

  3. TypeScript – Get Started

    前言 我学 TypeScript 的时候是 Angular 2.0 beta 的年代... 现在 Angular 都快 14 了. 但由于已经有 1 年半没有写 Angular 和 TypeScrip ...

  4. Qt连连看(三)非核心功能实现

    主要的界面设计好后,我们来看下非核心功能的实现.由于这块不需要用到稍微复杂的算法,解决起来相对来说容易许多,于是我们选择先实现这部分非核心功能,这块几乎不涉及游戏的核心逻辑. 游戏界面如下: 这时我们 ...

  5. docker 安装启动jenkins 以及问题剖析

    docker 安装启动jenkins 以及问题剖析   首先,你环境必须要有docker,我这里是自己本地虚拟机Vmware,我的虚拟机时linux centos7的 .如果你不知怎么安装虚拟机和命令 ...

  6. Spring —— 依赖自动装配

    依赖自动装配   IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配 自动装配方式 按类型(常用) 按名称 按构造方法 不启用自动装配    注意: 自动装配用于引 ...

  7. Shiro-721—漏洞分析(CVE-2019-12422)

    目录 Padding Oracle Attack 原理 PKCS5填充 怎么爆破攻击 漏洞原理 源码分析 漏洞复现 本文基于shiro550漏洞基础上分析,建议先看上期内容: https://blog ...

  8. 更新iManager离线镜像包方法

    例如将iserver_gisapplication_mapping_10_1_0.tar镜像更新到iManager仓库中 步骤一.将镜像导入本地镜像仓库 docker load -i iserver_ ...

  9. ASP 封装基本身份认证( HTTP Basic Authenticate)辅助类

    最近修改一个古老的asp程序,需要为单独几个页面进行基本身份认证.由于IIS自带的设置基本身份认证是针对文件夹的,而这几个页面又不方便挪动位置,幸好在网上找到一个asp实现WWW-Authentica ...

  10. 2. react项目【前端】+C#【后端】从0到1

    前端 1. 删除默认的src下所有文件,替换如下文件目录 2. src/index.js: