在商业领域,摄像头图像获取和处理的需求日益增长。例如,在医院中,可以拍摄患者的照片并将其与医疗档案一起上传到服务器;在银行中,工作人员可以使用网络摄像头扫描客户的身份证。尽管网络摄像头在上述场景中非常有用,但从头开始开发一个图像获取、编辑、保存和上传的应用程序并非易事。为了节省您的时间和精力,Dynamsoft开发了Dynamic .NET TWAIN SDK,它可以自动处理上述任务。基于.NET框架,您可以使用C#编写自己的应用程序,仅需几行代码。
简单。Dynamic .NET TWAIN专为C#和VB.NET设计,非常容易使用。您可以通过几行代码完成工作。
强大。Dynamic .NET TWAIN负责图像获取、编辑、保存和上传,有多种方式可供选择。您总能找到最适合您应用程序的解决方案。
灵活。支持WinForm和WPF。除了网络摄像头外,.NET控件还兼容扫描仪和其他成像设备。
在C#中创建一个简单的Forms应用程序:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dynamicDotNetTwain1.IfShowUI = true;
dynamicDotNetTwain1.SupportedDeviceType = EnumSupportedDeviceType.SDT_WEBCAM;
dynamicDotNetTwain1.IfThrowException = true;
}
}
将Dynamic .NET TWAIN添加到工具箱:
假设您已经安装了它,您可以浏览并添加位于C:\Program Files (x86)\Dynamsoft\Dynamic .NET TWAIN 4.1 Trial的DynamicDotNetTWAIN.dll。(如果您还没有在开发机器上安装它,可以从Dynamic .NET TWAIN 30-Day Free Trial下载试用版。)
将DynamicDotNetTwain拖放到表单上以创建控件:
向表单添加一个picturebox作为视频容器。添加用于选择摄像头、获取图像、保存/上传图像和删除图像的按钮。创建一个下拉框以保存分辨率。根据您的要求,可以添加更多功能。
初始化:
private void btnSelect_Click(object sender, EventArgs e)
{
try
{
dynamicDotNetTwain1.SelectSource();
dynamicDotNetTwain1.SetVideoContainer(pictureBox1);
dynamicDotNetTwain1.OpenSource();
// List the source name and resolutions
txtSourceName.Text = dynamicDotNetTwain1.CurrentSourceName;
int count = dynamicDotNetTwain1.ResolutionForCamList.Count;
for (int j = 0; j < count; j++)
{
string tempHeight = dynamicDotNetTwain1.ResolutionForCamList[j].Height.ToString();
string tempWidth = dynamicDotNetTwain1.ResolutionForCamList[j].Width.ToString();
string tempResolution = tempWidth + "X" + tempHeight;
comboResolution.Items.Insert(j, tempResolution);
comboResolution.SelectedIndex = 0;
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}
选择摄像头并开始视频流:
选择一个源:
更改分辨率:
private void comboResolution_SelectedIndexChanged(object sender, EventArgs e)
{
dynamicDotNetTwain1.ResolutionForCam = dynamicDotNetTwain1.ResolutionForCamList[comboResolution.SelectedIndex];
}
根据要求,除了分辨率外,您还可以在实际获取图像之前调整亮度、对比度、锐度等。
从视频流中获取图像:
private void btnAcquire_Click(object sender, EventArgs e)
{
try
{
dynamicDotNetTwain1.EnableSource();
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}
使用Dynamic .NET TWAIN的内置图像编辑器编辑图像:
private void btnEdit_Click(object sender, EventArgs e)
{
dynamicDotNetTwain1.ShowImageEditor();
}
您可以根据需要添加更多编辑功能。
将获取的图像保存在本地:
private void btnSave_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = "test.pdf";
saveFileDialog.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
dynamicDotNetTwain1.SaveAllAsPDF(saveFileDialog.FileName);
}
}
Dynamic .NET TWAIN提供了BMP、JPEG、PNG、(多页)TIF和(多页)PDF的内部编码器。
删除图像:
private void btnRemove_Click(object sender, EventArgs e)
{
dynamicDotNetTwain1.RemoveAllImages();
}
上传图像:
private void btnUpload_Click(object sender, EventArgs e)
{
string serverName = "localhost";
// please update the server name accordingly
string actionPagePath = "/UseWebcamInCSharp/SaveToFile.aspx";
dynamicDotNetTwain1.HTTPUploadAllThroughPostAsPDF(serverName, actionPagePath, "test.pdf");
}
有时,您可能希望将扫描的图像上传到您的系统,包括Web服务器、SQL Server、Oracle、SharePoint等。一些需求可能包括将图像和额外信息上传到不同的地方,例如,将图像上传到Web服务器,将相应的图像ID和评论上传到SQL Server数据库。这些可以通过Dynamic .NET TWAIN轻松实现。在本示例中,提供了最简单的一个。扫描的图像将作为多页PDF上传到本地Web服务器:
在服务器端,您需要添加一个操作页面来接收和处理(保存)上传的文件。如果您正在尝试从本文下载的示例代码,可以将UseWebcamInCSharp_IIS文件夹复制到您的Web服务器。
using System;
using System.IO;
using System.Collections.Generic;
using System.Web;
public partial class SaveToFile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
String strExc = "";
try
{
HttpFileCollection files = HttpContext.Current.Request.Files;
HttpPostedFile uploadfile = files["RemoteFile"];
uploadfile.SaveAs(System.Web.HttpContext.Current.Request.MapPath(".") + "/ImageScanned/" + uploadfile.FileName);
}
catch (Exception exc)
{
strExc = exc.ToString();
String strField1Path = HttpContext.Current.Request.MapPath(".") + "/" + "log.txt";
if (strField1Path != null)
{
StreamWriter sw1 = File.CreateText(strField1Path);
sw1.Write(strExc);
sw1.Close();
}
Response.Write(strExc);
}
}
}