实现图片盖章功能,在图片上点击,增加“图章”小图片,可以拖拽“图章”到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩。
操作方法:1.点击增加“图章”2.选中移动图标3.点中右下角放缩旋转图章。
效果图:
![]() |
实现代码如下:
1. 窗口Xaml代码
namespace Lenovo.YogaPaster
{
/// <summary>
/// ImageEditWindow.xaml 的交互逻辑
/// </summary>
public partial class ImageEditWindow : Window
{
public ImageEditWindow()
{
InitializeComponent();
this.Loaded += (sender, e) =>
{
canvas.MouseLeftButtonDown += canvas_MouseLeftButtonDown;
};
}
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
PhotoEditHelper.CommomMaxZIndex++;
var image = new MoveImage { ContainerCanvas = canvas };
Point point = e.GetPosition(canvas);
image.CreateImage(point);
}
/// <summary>
/// 保存方法
/// </summary>
public void SavePicture()
{
//TODO: openFile对话框
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = "图片"; // Default file name
saveFileDialog.DefaultExt = ".bmp"; // Default file extension
saveFileDialog.Filter = "图片文件 (.bmp)|*.bmp"; // Filter files by extension
// Show save file dialog box
Nullable<bool> result = saveFileDialog.ShowDialog();
// Process save file dialog box results
if (result == true)
{
// Save document
string filename = saveFileDialog.FileName;
if (File.Exists(filename))
{
File.Delete(filename);
}
BitmapSource bitmapSource = PictureMergeHelper.CreateNotRanderElementScreenshot(canvas, 1800, 1080);
BitmapEncoder bitmapEncoder = new BmpBitmapEncoder();
bitmapEncoder.Frames.Add(BitmapFrame.Create(bitmapSource));
FileStream fileStream = new FileStream(filename, FileMode.Create);
bitmapEncoder.Save(fileStream);
fileStream.Dispose();
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
SavePicture();
}
}
}</div>
3. MoveImage 类文件如下:
namespace Lenovo.YP.Utils
{
/// <summary>
/// 添加一个image控件,并实现拖动效果
/// </summary>
public class MoveImage
{
#region 字段
private int m_ZIndex;
/// <summary>
/// 当前图章的位置
/// </summary>
///
/// <summary>
/// 旋转图标的起始位置
/// </summary>
private Point m_ImageRoundStartOffset;
/// <summary>
/// 旋转图标的当前位置
/// </summary>
private Point m_ImageRoundOffset;
/// <summary>
/// 标识图章是否被拖拽
/// </summary>
private bool m_IsDragging;
/// <summary>
/// 标识旋转图标是否被是否被拖拽
/// </summary>
private bool m_IsimageRoundDragging;
/// <summary>
/// 图章的父容器
/// </summary>
public Canvas ContainerCanvas { get; set; }
/// <summary>
/// 图章图片
/// </summary>
private Image m_FlogImage;
/// <summary>
/// 旋转按钮图片
/// </summary>
private Image m_RotateImage;
/// <summary>
&n