实际效果如下:
实现思路:可以参考本链接
注:AForge库实现摄像头的打开和拍照功能,使用方法自行百度,下面有使用源码
实现源码如下:
private VideoCaptureDevice videoSource;
private FilterInfoCollection videoDevices;
private delegate void UpdateUI();
Point mouseDownPoint = new Point(); //记录拖拽过程鼠标位置
//第几个二维码
int mapIndex = 0;
Image[] images = new Image[10];
Image[] cancelIages = new Image[10];
Image picImage;
//实现拖拽
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo m_DownHitInfo_TuXing = null;
//容器布局事件
private void BtnLayout_Click(object sender, EventArgs e)
{
if (videoSource == null)
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices.Count == 0)
throw new ApplicationException();
videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.VideoResolution = videoSource.VideoCapabilities[0];
}
videoSource.NewFrame += new NewFrameEventHandler(videoSourceOne_NewFrame);
videoSource.Start();
}
void videoSourceOne_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (IsClose)
return;
try
{
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
fun(bitmap, picLayout );
}
catch (Exception ex)
{
MessageBox.Show("保存图像失败!");
}
}
private void fun(Bitmap img,PictureEdit pic)
{
if (pic.InvokeRequired)
{
UpdateUI update = delegate { pic.Image = img; };
pic.Invoke(update);
}
else
pic.Image = img;
}
//拍照事件
private void BtnPic_Click(object sender, EventArgs e)
{
mapIndex = 0;
cancelIages[mapIndex] = picLayout.Image;
images[mapIndex] = picLayout.Image;
picImage = picLayout.Image;
CloseVideoSource();
}
//释放
private void CloseVideoSource()
{
if (!(videoSource == null))
if (videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource = null;
}
}
//拖拽数据行
private void Gv_MouseDown(object sender, MouseEventArgs e)
{
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hi = this.gv.CalcHitInfo(new Point(e.X, e.Y));
int iMouseRowHandle = hi.RowHandle;
if (iMouseRowHandle >= 0 && e.Button == MouseButtons.Left)
{
m_DownHitInfo_TuXing = hi;
}
}
private void Gv_MouseMove(object sender, MouseEventArgs e)
{
GridView view = sender as GridView;
if (e.Button == MouseButtons.Left && m_DownHitInfo_TuXing != null)
{
Size dragSize = SystemInformation.DragSize;
Rectangle dragRect = new Rectangle(new Point(m_DownHitInfo_TuXing.HitPoint.X - dragSize.Width / 2, m_DownHitInfo_TuXing.HitPoint.Y - dragSize.Height / 2), dragSize);
//当鼠标离开原来的控件区域之后才显示拖拽效果
if (!dragRect.Contains(new Point(e.X, e.Y)))
{
DataRow row = view.GetDataRow(m_DownHitInfo_TuXing.RowHandle);
Model.DragDropData modelData = new Model.DragDropData();
modelData.Sender = gc;
modelData.Data = row;
view.GridControl.DoDragDrop(modelData, DragDropEffects.Move);
m_DownHitInfo_TuXing = null;
DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
}
}
}
namespace WinFormProgramUI.Layer.Model
{
public class DragDropData
{
public System.Windows.Forms.Control Sender { get; set; }
public object Data { get; set; }
}
}
//完成拖拽,合成图片
private void PicLayout_DragDrop(object sender, DragEventArgs e)
{
try
{
tmr_DragDrop.Stop();
Model.DragDropData modelData = (Model.DragDropData)e.Data.GetData(typeof(Model.DragDropData));
switch (modelData.Sender.Name)
{
case "gc":
//插入图形
string strImageID = ((DataRow)modelData.Data)["FES003"].ToString();
mapIndex++;
images[mapIndex] = QRCodeHelper.GenerricCode(strImageID);
Point pMouse = Cursor.Position;
Point pEMR_Edit = this.picLayout.PointToScreen(picLayout.Location);
mouseDownPoint = new Point(pMouse.X - pEMR_Edit.X, pMouse.Y - pEMR_Edit.Y);
Bitmap bmp = new Bitmap(picLayout.Image, picLayout.ClientRectangle.Width, picLayout.ClientRectangle.Height);
Graphics graphics = Graphics.FromImage(bmp);
graphics.DrawImage(images[mapIndex], new Point(mouseDownPoint.X - 50, mouseDownPoint.Y - 50));
graphics.Dispose();
picLayout.Image = bmp;
cancelIages[mapIndex] = picLayout.Image;
break;
default:
break;
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
}
}
private void PicLayout_DragOver(object sender, DragEventArgs e)
{
picLayout.Select();
if (e.Data.GetDataPresent(typeof(Model.DragDropData)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
//生成二维码
public class QRCodeHelper
{
/// <summary>
/// 生成二维码
/// </summary>
/// <param name="url"></param>
/// <param name="pixel"></param>
/// <returns></returns>
private static string GetQRCode(string url, int pixel)
{
var imgType = Base64QRCode.ImageType.Jpeg;
QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q);
Base64QRCode qrCode = new Base64QRCode(qrCodeData);
string qrCodeImageAsBase64 = qrCode.GetGraphic(pixel, Color.Black, Color.White, true, imgType);
return qrCodeImageAsBase64;
}
/// <summary>
/// 将Base64字符串转换为Image对象
/// </summary>
/// <param name="base64Str">base64字符串</param>
/// <returns></returns>
private static Bitmap Base64StrToImage(string base64Str)
{
Bitmap bitmap = null;
try
{
byte[] arr = Convert.FromBase64String(base64Str);
MemoryStream ms = new MemoryStream(arr);
Bitmap bmp = new Bitmap(ms);
ms.Close();
bitmap = bmp;
}
catch (Exception ex)
{
}
return bitmap;
}
/// <summary>
/// 通过字符串生成二维码图片
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static Image GenerricCode(string code)
{
string base64str = GetQRCode(code, 100);
Bitmap bitmap = Base64StrToImage(base64str);
return bitmap.GetThumbnailImage(100, 100, null, IntPtr.Zero);
}
}
//回撤
mapIndex--;
if (mapIndex > -1)
{
images[mapIndex] = cancelIages[mapIndex];
picLayout.Image = cancelIages[mapIndex];
}
else
mapIndex = 0;