第三方库:
wpfmediakit.dll (wpfmediakit摄像头处理)
zing.dll
nuget安装这两个第三方dll
项目截图预览:
项目代码:
using system; using system.collections.generic; using system.drawing; using system.io; using system.linq; using system.runtime.interopservices; using system.text; using system.threading.tasks; using system.windows; using system.windows.controls; using system.windows.data; using system.windows.documents; using system.windows.input; using system.windows.media; using system.windows.media.imaging; using system.windows.navigation; using system.windows.shapes; using system.windows.threading; using wpfmediakit.directshow.controls; using zxing; using zxing.common; using zxing.qrcode.internal; namespace qrcode { /// <summary> /// mainwindow.xaml 的交互逻辑 /// </summary> public partial class mainwindow : window { /// <summary> /// zxing 二维码扫描类 /// </summary> barcodereader codereader = new barcodereader(); /// <summary> /// 定时器 /// </summary> dispatchertimer cameratimer = new dispatchertimer(); public mainwindow() { initializecomponent(); // 配置的摄像头名称 var camera = "lenovo easycamera"; if (multimediautil.videoinputnames.contains(camera)) { //控件制定摄像头 vce.videocapturesource = camera; cameratimer.isenabled = false; cameratimer.interval = new timespan(200); //执行间隔0.2秒 cameratimer.tick += cameratimer_tick; } } /// <summary> /// 计时器方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void cameratimer_tick(object sender, eventargs e) { rendertargetbitmap bmp = new rendertargetbitmap((int)vce.actualwidth, (int)vce.actualheight, 96, 96, pixelformats.default); vce.measure(vce.rendersize); vce.arrange(new rect(vce.rendersize)); bmp.render(vce); bitmapencoder encoder = new jpegbitmapencoder(); encoder.frames.add(bitmapframe.create(bmp)); using (memorystream ms = new memorystream()) { encoder.save(ms); bitmap btimap = new bitmap(ms); var result = codereader.decode(btimap);//解析条码 if (result != null) { // 1:停止识别 cameratimer.stop(); vce.play(); messagebox.show($"识别内容为:{result}"); } } } private void btnshibie_click(object sender, routedeventargs e) { cameratimer.start(); } private void btnshnegceng_click(object sender, routedeventargs e) { var codimg= create("hello world!!"); imgqr.source = changebitmaptoimagesource(codimg); } /// <summary> /// 创建二维码 /// </summary> /// <param name="msg">二维码中保存的信息</param> /// <returns></returns> public static bitmap create(string msg) { multiformatwriter writer = new multiformatwriter(); dictionary<encodehinttype, object> hint = new dictionary<encodehinttype, object>(); //设置二维码为utf-8编码 hint.add(encodehinttype.character_set, "utf-8"); //设置纠错等级, 高 hint.add(encodehinttype.error_correction, errorcorrectionlevel.h); bitmatrix bm = writer.encode(msg, barcodeformat.qr_code, 200, 120, hint); barcodewriter barcodewriter = new barcodewriter(); bitmap bitmap = barcodewriter.write(bm); string codepath = directory.getcurrentdirectory() + "/code.jpg"; if (file.exists(codepath)) file.delete(codepath); bitmap.save(codepath); return bitmap; } /// <summary> /// 从bitmap转换成imagesource /// </summary> /// <param name="icon"></param> /// <returns></returns> public static imagesource changebitmaptoimagesource(bitmap bitmap) { intptr hbitmap = bitmap.gethbitmap(); imagesource wpfbitmap = system.windows.interop.imaging.createbitmapsourcefromhbitmap( hbitmap, intptr.zero, int32rect.empty, bitmapsizeoptions.fromemptyoptions()); if (!deleteobject(hbitmap)) { throw new system.componentmodel.win32exception(); } return wpfbitmap; } [dllimport("gdi32.dll", setlasterror = true)] private static extern bool deleteobject(intptr hobject); } }
项目源代码地址:
黄山市民网:https://www.huangshanshimin.com/