WPF实现签名拍照功能

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:WPF 案例及知识分享专栏
✨特色专栏:乐趣国学-心性养成之路
🥭本文内容:WPF实现签名拍照功能
  当你使用WPF(Windows Presentation Foundation)技术编写一个签名拍照软件时,需要使用C#来处理界面和相机操作。以下是一个简单示例,展示如何创建一个WPF应用程序来实现这一功能。

在这里插入图片描述

  首先,确保你已经安装了Visual Studio和.NET框架。然后,创建一个新的WPF应用程序项目,我们将称之为"SignatureCaptureApp"。

  在MainWindow.xaml中,创建界面布局,包括一个显示相机预览的区域、一个签名区域、一个按钮来拍照并保存签名。

<Window x:Class="SignatureCaptureApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Signature Capture App" Height="400" Width="600"><Grid><Image Name="CameraPreview" Width="400" Height="300" Stretch="UniformToFill" Margin="10"/><InkCanvas Name="SignatureCanvas" Width="400" Height="100" Margin="10"/><Button Content="拍照并保存签名" Click="CaptureSignature_Click" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,10"/></Grid>
</Window>

  在MainWindow.xaml.cs中,添加相机和签名捕捉的逻辑。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Media.Imaging;
using System.Windows.Media.Imaging;namespace SignatureCaptureApp
{public partial class MainWindow : Window{private CameraCapture _cameraCapture;public MainWindow(){InitializeComponent();_cameraCapture = new CameraCapture(CameraPreview);_cameraCapture.InitializeCamera();}private void CaptureSignature_Click(object sender, RoutedEventArgs e){// 拍照BitmapSource photo = _cameraCapture.CapturePhoto();// 保存签名if (SignatureCanvas.Strokes.Count > 0 && photo != null){SaveSignatureAndPhoto(SignatureCanvas.Strokes, photo);}}private void SaveSignatureAndPhoto(StrokeCollection strokes, BitmapSource photo){try{// 为签名创建一个独一无二的文件名string signatureFileName = $"Signature_{DateTime.Now:yyyyMMddHHmmss}.png";string photoFileName = $"Photo_{DateTime.Now:yyyyMMddHHmmss}.jpg";// 获取保存签名和照片的文件夹路径string saveFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);// 创建签名图片文件SaveSignatureToFile(strokes, Path.Combine(saveFolderPath, signatureFileName));// 创建照片文件SavePhotoToFile(photo, Path.Combine(saveFolderPath, photoFileName));}catch (Exception ex){// 处理错误,例如显示错误消息框MessageBox.Show($"保存签名和照片时发生错误:{ex.Message}");}}private void SaveSignatureToFile(StrokeCollection strokes, string filePath){// 创建一个RenderTargetBitmap用于绘制签名RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(400, 100, 96, 96, PixelFormats.Default);renderTargetBitmap.Render(SignatureCanvas);// 创建一个PngBitmapEncoder保存签名PngBitmapEncoder encoder = new PngBitmapEncoder();encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));// 将签名保存到文件using (FileStream fileStream = new FileStream(filePath, FileMode.Create)){encoder.Save(fileStream);}}private void SavePhotoToFile(BitmapSource photo, string filePath){// 创建一个JpegBitmapEncoder保存照片JpegBitmapEncoder encoder = new JpegBitmapEncoder();encoder.Frames.Add(BitmapFrame.Create(photo));// 将照片保存到文件using (FileStream fileStream = new FileStream(filePath, FileMode.Create)){encoder.Save(fileStream);}}}
}

  生成唯一的文件名,然后获取用于保存的文件夹路径(这里以"我的图片"文件夹为例)。接下来,它使用RenderTargetBitmap将签名画布渲染为位图,然后使用PngBitmapEncoder保存签名。同时,也使用JpegBitmapEncoder保存相机拍摄的照片。

  创建CameraCapture.cs类来处理相机操作。你需要使用WPF的MediaElement和System.Windows.Media.Imaging来实现相机预览和拍照功能。这里提供一个简化的示例,实际应用中需要更多的处理和错误处理。

  当你需要在WPF应用中初始化相机并进行拍照时,你可以使用MediaCapture类来实现。下面是更详细的示例,展示如何初始化相机并进行拍照:

using System;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows.Threading;
using System.Windows;
using System.IO;
using System.Threading.Tasks;
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Windows.Storage;
using Windows.Storage.Streams;namespace SignatureCaptureApp
{public class CameraCapture{private MediaElement _cameraPreview;private MediaCapture _mediaCapture;public CameraCapture(MediaElement cameraPreview){_cameraPreview = cameraPreview;}public async void InitializeCamera(){try{// 初始化MediaCapture对象_mediaCapture = new MediaCapture();await _mediaCapture.InitializeAsync();// 将相机预览显示在MediaElement中_cameraPreview.SetMediaPlayer(_mediaCapture);// 启动相机预览await _mediaCapture.StartPreviewAsync();}catch (Exception ex){// 处理错误,例如显示错误消息框MessageBox.Show($"初始化相机时发生错误:{ex.Message}");}}public async Task<BitmapSource> CapturePhoto(){try{// 创建一个临时文件来保存照片StorageFile photoFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("TempPhoto.jpg", CreationCollisionOption.GenerateUniqueName);// 拍照并保存到临时文件ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();await _mediaCapture.CapturePhotoToStorageFileAsync(imageProperties, photoFile);// 从临时文件中读取照片数据using (IRandomAccessStream photoStream = await photoFile.OpenReadAsync()){// 创建一个BitmapDecoder来解码照片数据BitmapDecoder decoder = await BitmapDecoder.CreateAsync(photoStream);// 将照片解码为BitmapSourceSoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync();SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);BitmapSource photo = await ConvertToBitmapSource(softwareBitmapBGR8);// 删除临时文件await photoFile.DeleteAsync();// 返回照片return photo;}}catch (Exception ex){// 处理错误,例如显示错误消息框MessageBox.Show($"拍照时发生错误:{ex.Message}");return null;}}private async Task<BitmapSource> ConvertToBitmapSource(SoftwareBitmap softwareBitmap){// 创建一个WriteableBitmap来保存照片数据WriteableBitmap bitmap = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight);softwareBitmap.CopyToBuffer(bitmap.PixelBuffer);// 等待UI线程空闲,然后在UI线程上创建BitmapSourceawait Application.Current.Dispatcher.BeginInvoke(new Action(() =>{bitmap.Invalidate();}), DispatcherPriority.ApplicationIdle);return bitmap;}}
}

  在InitializeCamera方法中,我们使用MediaCapture类来初始化相机,并将相机预览显示在MediaElement中。在CapturePhoto方法中,我们使用CapturePhotoToStorageFileAsync方法拍照并将照片保存到临时文件中。然后,我们使用BitmapDecoder类解码照片数据,并将其转换为BitmapSource对象。最后,我们删除临时文件并返回照片。

  请注意,这段代码使用了异步方法,因此需要在方法前面加上async关键字,并使用await关键字来等待异步操作完成。此外,我们还使用了SoftwareBitmap和WriteableBitmap来处理照片数据。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/140602.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络笔记】计算机网络性能(1)——速率、带宽、延迟

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 系列文章目录速率带宽延迟/时延(delay或latency) 下面介绍一些计算机网络中常用的性能指标。在本篇中涉及速…

uniapp(uncloud) 使用生态开发接口详情5(云公共模块)

1.uniCloud官网 云对象中云公共模块: 网站: https://uniapp.dcloud.net.cn/uniCloud/cf-common.html // 官网介绍 cloudfunctions├─common // 云函数公用模块目录| └─hello-common // 云函数公用模块| ├─package.json| └─index.js // 公用模块代码&#xff0…

一些经典的神经网络(第17天)

1. 经典神经网络LeNet LeNet是早期成功的神经网络&#xff1b; 先使用卷积层来学习图片空间信息 然后使用全连接层来转到到类别空间 【通过在卷积层后加入激活函数&#xff0c;可以引入非线性、增加模型的表达能力、增强稀疏性和解决梯度消失等问题&#xff0c;从而提高卷积…

VR全景图片如何拍摄制作,拍摄制作过程中要注意什么?

引言&#xff1a; VR全景图片就是通过专业的相机设备捕捉到的一个空间的高清图像&#xff0c;再经过专业工具进行拼合&#xff0c;呈现出一种环绕式的视觉效果。想象一下&#xff0c;当你站在一个完全真实的环境中&#xff0c;可以自由地转动视角&#xff0c;看到四周的景色&a…

Unreal Engine 4 + miniconda + Python2.7 + Pycharm

1.​首先启用UE4插件里的Python Scripting插件 ​ 2. 在UE4项目设置中 开启Python开发者模式 生成unreal.py文件&#xff0c;用于在Pychram中引入Unreal PythonAPI 生成的unreal.py 在&#xff1a; "项目路径\Intermediate\PythonStub\unreal.py"3. 安装Miniconda…

【Axure高保真原型】3D柱状图_中继器版

今天和大家分享3D柱状图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的柱状图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

浅谈云原生

目录 1. 云原生是什么&#xff1f; 2. 云原生四要素 2.1 微服务 2.2 容器化 2.3 DevOps 2.4 持续交付 3. 具体的云原生技术有哪些&#xff1f; 3.1 容器 (Containers) 3.2 微服务 (Microservices) 3.3 服务网格 (Service Meshes) 3.4 不可变基础设施 (Immutable Inf…

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x…

ABS算法开发与测试(基于ModelBase实现)

ModelBase是经纬恒润开发的车辆仿真软件&#xff0c;包含两个大版本&#xff1a;动力学版本、智能驾驶版本。动力学版包含高精度动力学模型&#xff0c;能很好地复现车辆在实际道路中运行的各种状态变化&#xff0c;可用于乘用车、商用车动力底盘系统算法开发、控制器仿真测试&…

KES服务管理和环境变量配置(Kylin)

KES服务管理命令 root用户systemctl管理 确认KES服务状态 systemctl status kingbase8d.service停止KES服务 systemctl stop kingbase8d.service启动KES服务 systemctl start kingbase8d.service重启KES服务 systemctl restart kingbase8d.servicekingbase用户sys_ctl命令…

git 查看本地秘钥

第一步&#xff1a; 1&#xff0c;打开终端或者命令行窗口&#xff0c;输入一下命令&#xff1a; cd ~/.ssh进入ssh目录 2&#xff0c;查看该目录下的所有文件&#xff0c;输入以下命令: ls -al该命令将显示ssh目录下的所有文件&#xff0c;包括秘钥文件和配置文件,如果不存…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做&#xff0c;因此并不存在提供详细接口文档等问题。随着项目的不断迭代&#xff0c;团队规模逐渐扩大&#xff0c;我们决定将前后端分开&#xff0c;专门由专业的前端和后端人员进行开发工作。然而&#xff0c;这样的改变也带来了…