将印章设计模块设计的印章保存为图片并集中存放在指定文件夹内。新建印章应用项目,主要实现对图片及PDF文件加盖印章功能。本文实现给图片加盖印章功能。
给图片加盖印章的逻辑比较简单,就是将印章图片绘制到图片指定位置,使用SKControl控件绘制图片(之前使用Panel控件和GDI+绘制图片,Panel自带滚动条及相关设置,暂时没有看到SKControl控件的滚动条设置方式)。
主要实现的功能包括:
1)枚举指定文件夹内的印章图片,选择印章后在线预览印章图片;
2)打开本地图片并在SKControl控件绘制图片,支持图片缩放;
3)点击加盖印章按钮,支持鼠标在SKControl控件中移动时实时显示印章,点击鼠标左键时,在点击位置加盖印章(将印章图片绘制到图片中鼠标点击位置)。
关键代码及运行效果如下。程序运行时遇到的问题是印章图片和待盖章图片的分辨率不一样时,将印章图片绘制到待盖章图片中后,会出现印章变大或变小的情况,后续考虑如何处理这种情况。
private void pnlImage_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e)
{
SKCanvas canvas = e.Surface.Canvas;
canvas.Clear();
if (m_srcImage != null)
{
canvas.DrawBitmap(m_srcImage, new SKRect(m_startX, m_startY, m_startX + m_srcImage.Width * m_scale, m_startY + m_srcImage.Height * m_scale));
if (m_sealImage != null && !m_sealFixed)
{
canvas.DrawBitmap(m_sealImage, new SKRect(m_sealStartX, m_sealStartY, m_sealStartX + m_sealImage.Width * m_scale, m_sealStartY + m_sealImage.Height * m_scale));
}
}
}
private void pnlImage_MouseMove(object sender, MouseEventArgs e)
{
if (!m_sealFixed)
{
m_sealStartX = e.X;
m_sealStartY = e.Y;
pnlImage.Invalidate();
}
}
private void pnlImage_MouseClick(object sender, MouseEventArgs e)
{
if (m_srcImage != null && !m_sealFixed)
{
if (MessageBox.Show("确定在此处盖章?") == DialogResult.OK)
{
m_sealFixed = true;
using (SKCanvas canvas = new SKCanvas(m_srcImage))
{
canvas.DrawBitmap(m_sealImage, new SKPoint((e.X - m_startX) / m_scale, (e.Y - m_startY) / m_scale));
}
m_sealImage = null;
pnlImage.Invalidate();
}
}
}
参考文献:
[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