Skia4Delphi 是一个开源的跨平台 2D 图形库,用于 Delphi,它利用了备受赞誉的 Google Skia 库。
关于 Skia Skia 是一个卓越的开源库,专注于以精准、高质量和高性能渲染 2D 文本、几何形状和图像。它提供了灵活的 API,兼容广泛的硬件和软件平台。
Google 的 Skia 图形库是众多产品的图形引擎,包括 Google Chrome、Chrome OS、Android、Flutter、Xamarin、Mozilla Firefox、Firefox OS 等。
功能
-
2D 画布和文本布局;
-
CPU 软件光栅化;
-
GPU 加速渲染;
-
从右到左的渲染;
-
SVG 渲染和创建;
-
PDF 输出;
-
运行时效果;
-
着色语言;
-
着色器、遮罩和颜色过滤器;
-
图像和路径效果;
-
动画图像播放器(Lottie、GIF、WebP);
-
图像编解码器(bmp、gif、ico、jpg、png、wbmp、webp 和原始图像)等。
FMX 渲染替代 使用 Skia4Delphi 库,可以覆盖 Firemonkey 的图形引擎,使其将 Skia 作为默认画布。这样,您的 Firemonkey 应用程序将自动实现以下功能:
-
在任何平台上以抗锯齿方式绘制(绘图质量基于 Form.Quality 属性);
-
将应用程序的整体图形性能提高多达 50%(即使以更高的质量进行绘制);
-
以更高的质量调整图像大小(也基于 Form.Quality);
-
支持从右到左的文本渲染;
-
修复数十处绘图中的不一致问题(尤其是在角落和笔画处,例如虚线,以及带有特殊表情符号的文本);
-
提高库的整体性能(包括控件、绘图等)。
如何使用这个控件包
安装
您可以使用以下三种方式安装 Skia4Delphi:
-
安装程序(推荐)
下载最新版本的安装程序并安装。 -
Skia4Delphi 安装
使用 Embarcadero 的 GetIt(RAD Studio > Tools > GetIt Package Manager…)进行安装。 -
Chocolatey 包管理器
在命令行中运行以下命令安装:choco install skia4delphi
启用 Skia
安装 Skia4Delphi 后,只需右键单击您的应用程序项目并选择“Enable Skia ”。
安装 Skia4Delphi 后,只需右键单击您的应用程序项目并选择“Enable Skia ”。
提示
为了提高 FMX 绘图的质量和性能,FMX 图形引擎将自动替换为 Skia4Delphi 渲染器。
为了提高 FMX 绘图的质量和性能,FMX 图形引擎将自动替换为 Skia4Delphi 渲染器。
示例
在本节中,您将找到一些使用 Skia4Delphi 的示例,这些示例适用于控制台、FMX 和 VCL 应用程序。以下代码是本节中所有示例的通用代码:
在本节中,您将找到一些使用 Skia4Delphi 的示例,这些示例适用于控制台、FMX 和 VCL 应用程序。以下代码是本节中所有示例的通用代码:
uses
System.Skia;
type
TSkDrawExampleProc = reference to procedure(const ACanvas: ISkCanvas; const ADest: TRectF);
procedure DrawExample(const AWidth, AHeight: Integer; const ADrawProc: TSkDrawExampleProc);
begin
var LSurface := TSkSurface.MakeRaster(AWidth, AHeight);
LSurface.Canvas.Clear(TAlphaColors.Null);
ADrawProc(LSurface.Canvas, RectF(0, 0, AWidth, AHeight));
LSurface.MakeImageSnapshot.EncodeToFile('output.png');
end;
基本用法
以下代码展示了如何绘制图形:
DrawExample(256, 256,
procedure (const ACanvas: ISkCanvas; const ADest: TRectF)
begin
var LPaint: ISkPaint := TSkPaint.Create;
LPaint.AntiAlias := True;
LPaint.Color := $FF4285F4;
var LRect := TRectF.Create(PointF(10, 10), 100, 160);
ACanvas.DrawRect(LRect, LPaint);
var LOval: ISkRoundRect := TSkRoundRect.Create;
LOval.SetOval(LRect);
LOval.Offset(40, 80);
LPaint.Color := $FFDB4437;
ACanvas.DrawRoundRect(LOval, LPaint);
LPaint.Color := $FF0F9D58;
ACanvas.DrawCircle(180, 50, 25, LPaint);
LRect.Offset(80, 50);
LPaint.Color := $FFF4B400;
LPaint.Style := TSkPaintStyle.Stroke;
LPaint.StrokeWidth := 4;
ACanvas.DrawRoundRect(LRect, 10, 10, LPaint);
end);
运行效果如下图:
PDF
使用 Skia4Delphi,可以创建 PDF 文档,并在其中绘制任何内容,包括文本和图像。以下示例展示了如何创建一个 PDF 文档并在其中绘制一个 SVG 图像:
var LSVGDOM := TSkSVGDOM.MakeFromFile('Samples\Demo\Assets\lion.svg');
var LSize := TSizeF.Create(600, 600);
LSVGDOM.SetContainerSize(LSize);
var LDocumentStream := TFileStream.Create('output.pdf', fmCreate);
try
var LDocument := TSkDocument.MakePDF(LDocumentStream);
try
var LCanvas := LDocument.BeginPage(LSize.Width, LSize.Height);
try
// Draw anything here with Skia canvas
LSVGDOM.Render(LCanvas);
finally
LDocument.EndPage;
end;
finally
LDocument.Close;
end;
finally
LDocumentStream.Free;
end;
运行效果如图:
编解码器(Codecs)
Skia4Delphi 库支持多种图像格式。以下是支持的格式列表:
支持的解码格式
图像格式 | 扩展名 |
---|---|
位图 (Bitmap) | .bmp |
GIF | .gif |
图标 (Icon) | .ico |
JPEG | .jpg, .jpeg |
PNG | .png |
Adobe DNG 数字负片原始格式 | .dng |
佳能原始格式 (Canon) | .cr2 |
富士胶片原始格式 (Fujifilm RAF) | .raf |
尼康原始格式 (Nikon) | .nef, .nrw |
奥林巴斯原始格式 (Olympus ORF) | .orf |
松下原始格式 (Panasonic) | .rw2 |
宾得原始格式 (Pentax PEF) | .pef |
三星原始格式 (Samsung SRW) | .srw |
索尼原始格式 (Sony) | .arw |
WBMP | .wbmp |
WebP | .webp |
注意:原始图像格式(Raw)仅限于非 Windows 平台。
支持的编码格式
图像格式 | 扩展名 |
---|---|
JPEG | .jpg, .jpeg |
PNG | .png |
WebP | .webp |
关于 WebP
WebP 是一种现代图像格式,为图像提供了卓越的无损和有损压缩。
-
WebP 无损图像比 PNG 小 26%。
-
WebP 有损图像在同等质量下比 JPEG 小 25%-34%。
以下示例演示了如何将图像编码为 WebP 格式:
var LImage := TSkImage.MakeFromEncodedFile('Samples\Demo\Assets\kung-fu-panda.png');
LImage.EncodeToFile('output.webp', TSkEncodedImageFormat.WEBP, 80);
LImage.EncodeToFile('output.jpg', TSkEncodedImageFormat.JPEG, 80);
运行效果如图:
格式 | 大小 |
---|---|
Png (100% 质量) | 512 KB |
Jpeg (80% 质量) | 65 KB |
WebP (80% 质量) | 51 KB |
与 Delphi 集成
位图
可以使用以下代码使用 Skia 的画布编辑 TBitmap(VCL 或 FMX):
uses
System.Skia, FMX.Skia {or Vcl.Skia};
...
var LBitmap := TBitmap.Create(100, 100);
try
LBitmap.SkiaDraw(
procedure (const ACanvas: ISkCanvas)
begin
// Draw with Skia canvas...
end);
图像格式
该库注册了以下编解码器:
-
VCL: .svg, .webp, .wbmp 和原始图像 (.arw, .cr2, .dng, .nef, .nrw, .orf, .raf, .rw2, .pef 和 .srw)。
-
FMX: .bmp, .gif, .ico, .webp, .wbmp 和原始图像 (.arw, .cr2, .dng, .nef, .nrw, .orf, .raf, .rw2, .pef 和 .srw)。
因此,任何 Delphi 控件(例如 TImage)都可以自动加载这些新格式。
FMX 渲染
您可以将 FMX 的默认画布替换为基于 Skia 的画布。启用此功能后,所有 FMX 控件将自动使用 Skia4Delphi 进行内部绘制。这样一来,您可以提高整个 FMX 应用程序的绘图质量和性能,并更好地与其他库功能集成。
启用 Skia 渲染
打开您的 Delphi 应用程序项目源代码 (.dpr),在
FMX.Forms
单元之后包含 FMX.Skia
单元,并将 GlobalUseSkia
设置为 True,如下例所示:uses
System.StartUpCopy,
FMX.Forms,
FMX.Skia,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
GlobalUseSkia := True;
Application.Initialize;
...
注意事项
-
FMX.Skia
单元必须在FMX.Forms
之后包含; -
Skia Metal 渲染可以通过在
FMX.Forms
之后包含FMX.Types
单元,并将GlobalUseMetal
与GlobalUseSkia
一起设置为 True,以提高 iOS 和 macOS 上的速度; -
Skia Vulkan 渲染可以在 RAD Studio 12 Athens 或更高版本中使用,通过在
FMX.Forms
之后包含FMX.Types
单元,并将GlobalUseVulkan
与GlobalUseSkia
一起设置为 True,以提高 Android 和 Windows 上的速度。在 Windows 上,只有同时添加GlobalUseSkiaRasterWhenAvailable := False;
时才会使用 Vulkan; -
GlobalUseSkia := True;
的声明以及 FMX 的其他变量(如GlobalUseMetal
)也可以在 .dpr 文件的初始化部分中完成。有时这是非常必要的,因为如果在某个单元的初始化或类构造函数中使用了位图,则 .dpr 中的 GlobalUseXXX 声明将无效。在这种情况下,只需在项目中创建一个名为 “Project.Startup.pas” 的单元,将 GlobalUseXXX 声明放在该单元的初始化部分,并在 .dpr 文件中将其声明在您的任何其他单元之前,即在FMX.Forms
之后。
基准测试
性能测试模拟了一个真实的应用程序,包含数百个控件,用于测量垂直滚动时的 FPS(每秒帧数)。
。
设备 | 平台 | FMX | Skia |
---|---|---|---|
Motorola Moto 3rd Generation | Android | 25 fps | 38 fps |
LG K40s | Android | 30 fps | 47 fps |
Samsung Galaxy A01 Core | Android | 20 fps | 26 fps |
Samsung Galaxy S7 Edge | Android64 | 53 fps | 56 fps |
Samsung Galaxy S8 Plus | Android64 | 50 fps | 55 fps |
Apple iPhone 11 | iOSDevice64 | 59 fps | 60 fps |
Apple iPhone 12 | iOSDevice64 | 59 fps | 59 fps |
Apple MacBook Air Model A2337 | OSXARM64 | 58 fps | 30 fps * |
Intel Core i7-8565U / Radeon 520 | Win32 | 82 fps | 92 fps |
Intel Core i7-8565U / Radeon 520 | Win64 | 83 fps | 91 fps |
Intel Core i7-4500U / GeForce GT 720M | Win32 | 85 fps | 92 fps |
Intel Core i7-4500U / GeForce GT 720M | Win64 | 86 fps | 93 fps |
Metal
设备 | 平台 | FMX | Skia |
---|---|---|---|
Apple iPhone 11 | iOSDevice64 | 59 fps | 60 fps |
Apple iPhone 12 | iOSDevice64 | 59 fps | 59 fps |
Apple MacBook Air Model A2337 | OSXARM64 | 60 fps | 60 fps |
注意事项
-
默认的 FMX 渲染器在某些平台上(如移动设备)不使用抗锯齿,而 Skia 渲染器则使用。也就是说,Skia 的绘图质量和性能优于默认的 FMX 渲染器。
默认 FMX 渲染 使用 Skia 渲染的 FMX -
在 macOS 上,
Skia4Delphi
的默认渲染器不支持 GPU 加速。因此,强烈建议使用 Skia Metal(同时启用GlobalUseSkia
和GlobalUseMetal
),以充分发挥机器的性能。 -
在虚拟机上进行的测试结果可能与实际情况不一致。
Skia 画布
使用 Skia 的渲染功能时,可以在位图、控件或表单的场景中访问 Skia 画布属性,如下所示:
在位图中
uses
System.Skia, FMX.Skia.Canvas;
begin
var LBitmap := TBitmap.Create(300, 300);
try
LBitmap.Canvas.BeginScene;
try
var LCanvas: ISkCanvas := TSkCanvasCustom(LBitmap.Canvas).Canvas;
// 使用 Skia 画布(LCanvas)直接绘制以解锁新功能...
finally
LBitmap.Canvas.EndScene;
end;
finally
LBitmap.Free;
end;
end;
在控件和窗体中
type
TMyControl = class(TControl)
protected
procedure Paint; override;
end;
implementation
uses
System.Skia, FMX.Skia.Canvas;
procedure TMyControl.Paint;
begin
var LCanvas: ISkCanvas := TSkCanvasCustom(Canvas).Canvas;
// 使用 Skia 画布(LCanvas)直接绘制以解锁新功能...
end;
注意事项
-
Canvas
属性仅在场景期间可用,即在位图的BeginScene
和EndScene
之间,以及控件和表单的绘制事件/方法期间(例如 OnPaint、OnPainting、PaintChildren 等); -
用于 UI 的画布(从窗口创建,例如 TRectangles、TCircles 或继承自 TControl 的对象)必须仅在 主线程 中绘制,而从
TBitmap
创建的画布是 线程安全的。
从右到左显示
使用 Skia 的渲染功能后,您的应用程序将支持从右到左的文本渲染。为此,您需要对项目进行以下 3 项更改:
-
对于 RAD Studio 11.3 之前的版本,打开您的 Delphi 应用程序项目源代码 (.dpr),并添加以下代码:
program Project1; uses System.StartUpCopy, FMX.Forms, System.Classes, FMX.Skia, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.BiDiMode := TBiDiMode.bdRightToLeft; GlobalUseSkia := True; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
-
将表单的
BiDiMode
属性设置为bdRightToLeft
; -
对于 TEdit 和 TMemo 等键盘输入控件,建议等待 Embarcadero 修复。作为临时解决方案,可以将这些控件的
ControlType
属性设置为Platform
。
自定义字体
使用 Skia 的渲染功能,您可以在任何平台上通过非常简单的方式在任何 FMX 控件中使用自定义字体。只需在应用程序初始化时注册它们即可:program Project1; uses System.StartUpCopy, FMX.Forms, FMX.Skia, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin GlobalUseSkia := True; TSkDefaultProviders.RegisterTypeface('Poppins.ttf'); Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
在 RAD Studio 12 Athens 或更高版本中,建议使用IFMXFontManagerService
:program Project1; uses System.StartUpCopy, FMX.Forms, FMX.Platform, FMX.FontManager, FMX.Skia, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin GlobalUseSkia := True; var LFontManager: IFMXFontManagerService; if TPlatformServices.Current.SupportsPlatformService(IFMXFontManagerService, LFontManager) then LFontManager.AddCustomFontFromFile('Poppins.ttf'); Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
VCL/FMX 控件
TSkAnimatedImage
TSkAnimatedImage 是一个用于加载和渲染动画图像(包括矢量动画)的控件,使用非常简单。支持的格式如下:格式 扩展名 Lottie 文件 .json, .lottie Telegram 贴纸 .tgs 动画 GIF .gif 动画 WebP .webp 以下示例展示了如何使用 TSkAnimatedImage 播放 Lottie 文件:var LAnimatedimage := TSkAnimatedImage.Create(Self); LAnimatedimage.LoadFromFile('Samples\Demo\Assets\rocket.json'); LAnimatedimage.Parent := Self;
TSkLabel
TSkLabel 是一个内部实现 SkParagraph 的控件,比 TLabel 具有更多的功能,例如:-
字体家族(类似于 CSS 的字体回退列表);
-
字体粗细;
-
字体倾斜;
-
支持文本中的多种样式;
-
支持从右到左(BiDi);
-
支持对齐方式(两端对齐);
-
支持自定义字体(无需安装字体);
-
支持文本部分的背景颜色;
-
限制最大行数;
-
自动调整大小(宽度和高度);
-
高级装饰(例如波浪线、上划线、虚线等);
TSkPaintBox
TSkPaintBox 是一个理想的控件,可以直接在画布上使用 Skia API 进行绘制,通过OnDraw
事件实现: -
procedure TForm1.SkPaintBox1Draw(ASender: TObject; const ACanvas: ISkCanvas;
const ADest: TRectF; const AOpacity: Single);
begin
var LPaint: ISkPaint := TSkPaint.Create;
LPaint.Shader := TSkShader.MakeGradientSweep(ADest.CenterPoint,
[$FFFCE68D, $FFF7CAA5, $FF2EBBC1, $FFFCE68D]);
ACanvas.DrawPaint(LPaint);
end;
注意:TSkPaintBox 具有绘图缓存系统。要强制刷新绘图,可以调用 TSkPaintBox.Redraw。但是,出于优化原因,启用了 Skia4Delphi 渲染 的 FMX 应用程序中不存在此缓存系统。
TSkSvg
TSkSvg 是一个用于加载和显示 SVG 的控件,使用非常简单:
var LSvg := TSkSvg.Create(Self);
LSvg.Svg.Source := TFile.ReadAllText('Samples\Demo\Assets\panda.svg');
LSvg.Parent := Self;
兼容性
RAD Studio | 平台 |
---|---|
RAD Studio 11 Alexandria 或更高版本 | 所有平台 |
RAD Studio 10.3 Rio 或更高版本 | Windows, Android |
RAD Studio XE7 或更高版本 | Windows |
对于 Skia4Delphi 支持的平台(如上所示)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END