除了文本,印章设计模块的绘图功能已经差不多了。在实现文本绘制之前(主要是文本绘制相对比较麻烦),本文先实现将印章导出为pdf或图片的功能。
不论是在控件中绘制,还是在图片或pdf文件中绘制印章,对SkiaSharp而言都是获取SKCanvas对象,然后开始画图。因此需要重构之前直接写在SKControl控件的PaintSurface事件中的绘图函数,定义如下函数供不同形式的绘图需要。
void DrawSeal(SKCanvas canvas, float unitSize)
针对图片而言,创建SKBitmap对象绘图,然后基于其创建SKCanvas对象绘图,主要代码如下所示。这里有个问题还没有处理,计算单位尺寸的时候使用的SKControl控件的dpi,暂时不清楚如何获取或者设置图片的dpi。
Func<float, int, float> unitConverter = m_currSeal.UnitType == UnitType.Pixel ? CommonFunction.Pixel2Pixel : CommonFunction.MM2Pixel;
float unitSize = unitConverter(1, skBoard.DeviceDpi);
using SKBitmap bitmap = new SKBitmap(Convert.ToInt32(unitSize * m_currSeal.Width), Convert.ToInt32(unitSize * m_currSeal.Height));DrawSeal(new SKCanvas(bitmap), unitSize);
bitmap.ToBitmap().Save(saveFileDialog.FileName);
针对pdf而言,主要使用SKDocument.CreatePdf函数创建pdf文档,然后调用SKDocument. BeginPage创建绘图对象,这里pdf采用的SKDocument的默认dpi(72),也可以通过SKDocumentPdfMetadata对象在CreatePdf函数时指定dpi,主要代码如下。
using SKDocument doc = SKDocument.CreatePdf(saveFileDialog.FileName);
Func<float, int, float> unitConverter = m_currSeal.UnitType == UnitType.Pixel ? CommonFunction.Pixel2Pixel : CommonFunction.MM2Pixel; ;float unitSize = unitConverter(1, (int)SKDocument.DefaultRasterDpi);
SKCanvas canvas = doc.BeginPage(unitSize * m_currSeal.Width, unitSize * m_currSeal.Height);
DrawSeal(canvas, unitSize);
doc.EndPage();
doc.Close();
最后是程序运行效果及导入的pdf和图片效果。
参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88
[2]https://www.cnblogs.com/bhnian/p/16343557.html
[3]https://www.jb51.net/html5/676291.html
[4]https://blog.csdn.net/L_Shaker/article/details/127313457
[5]https://www.cnblogs.com/sunnytrudeau/p/15570085.html