c# 2.0实现摄象头视频采集,拍照,录象
From: http://blog.csdn.net/ysq5202121/article/details/5672291
Camera.cs类文件using System;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Collections;
using System.Data;namespace SoundVideo
{public class Camera{public delegate void RecievedFrameEventHandler(byte[] data);public event RecievedFrameEventHandler RecievedFrame;public IntPtr lwndC;private IntPtr mControlPtr;private int mWidth;private int mHeight;private showVideo.FrameEventHandler mFrameEventHandler;public Camera(IntPtr handle, int width, int height){mControlPtr = handle;mWidth = width;mHeight = height;}public void CloseCamera(){this.capDriverDisconnect(this.lwndC);}public void StartCamera(){try{byte[] lpszName = new byte[100];byte[] lpszVer = new byte[100];showVideo.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);this.lwndC = showVideo.capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE + showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);if (this.capDriverConnect(this.lwndC, 0)){this.capPreviewRate(this.lwndC, 66);this.capPreview(this.lwndC, true);showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO();bitmapinfo.bmiHeader.biSize = showVideo.SizeOf(bitmapinfo.bmiHeader);bitmapinfo.bmiHeader.biWidth = 352;bitmapinfo.bmiHeader.biHeight = 288;bitmapinfo.bmiHeader.biPlanes = 1;bitmapinfo.bmiHeader.biBitCount = 24;this.capSetVideoFormat(this.lwndC, ref bitmapinfo, showVideo.SizeOf(bitmapinfo));this.mFrameEventHandler = new showVideo.FrameEventHandler(FrameCallBack);this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);showVideo.SetWindowPos(this.lwndC, 0, 0, 0, mWidth, mHeight, 6);}}catch{throw;}}public void bitMapToJPG(string bmpFileName, string jpgFileName){System.Drawing.Image img;img = ReturnPhoto(bmpFileName);img.Save(jpgFileName, ImageFormat.Jpeg);}private Image ReturnPhoto(string bmpFileName){try{System.IO.FileStream stream;stream = File.OpenRead(bmpFileName);Bitmap bmp = new Bitmap(stream);System.Drawing.Image image = bmp;//得到原图//创建指定大小的图System.Drawing.Image newImage = image.GetThumbnailImage(bmp.Width, bmp.Height, null, new IntPtr());Graphics g = Graphics.FromImage(newImage);g.DrawImage(newImage, 0, 0, newImage.Width, newImage.Height); //将原图画到指定的图上g.Dispose();stream.Close();return newImage;}catch{throw;}}public void capImage(IntPtr lwnd, string path)//抓图{showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO();IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);showVideo.SendMessage(lwnd, showVideo.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());}public void capScope(IntPtr lwnd, string path)// 录像,保存avi文件的路径{IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);showVideo.SendMessage(lwnd, showVideo.WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());showVideo.SendMessage(lwnd, showVideo.WM_CAP_SEQUENCE, 0, 0);}public void stopCapScope(IntPtr lwnd)// 停止录像{showVideo.SendMessage(lwnd, showVideo.WM_CAP_STOP, 0, 0);}private bool capDriverConnect(IntPtr lwnd, short i){return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_CONNECT, i, 0);}private bool capDriverDisconnect(IntPtr lwnd){return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_DISCONNECT, 0, 0);}private bool capPreview(IntPtr lwnd, bool f){return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEW, f, 0);}private bool capPreviewRate(IntPtr lwnd, short wMS){return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEWRATE, wMS, 0);}private bool capSetCallbackOnFrame(IntPtr lwnd, showVideo.FrameEventHandler lpProc){return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);}private bool capSetVideoFormat(IntPtr hCapWnd, ref showVideo.BITMAPINFO BmpFormat, int CapFormatSize){return showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);}private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr){try{showVideo.VIDEOHDR videoHeader = new showVideo.VIDEOHDR();byte[] VideoData;videoHeader = (showVideo.VIDEOHDR)showVideo.GetStructure(lpVHdr, videoHeader);VideoData = new byte[videoHeader.dwBytesUsed];showVideo.Copy(videoHeader.lpData, VideoData);if (this.RecievedFrame != null) this.RecievedFrame(VideoData);}catch{throw;}}}
}ShowVideo.cs类文件using System;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Collections;
using System.Data;namespace SoundVideo
{public class showVideo{[DllImport("avicap32.dll")]public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);[DllImport("avicap32.dll")]public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);[DllImport("User32.dll")]public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);[DllImport("avicap32.dll")]public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);public const int WM_USER = 0x400;public const int WS_CHILD = 0x40000000;public const int WS_VISIBLE = 0x10000000;public const int WM_CAP_START = WM_USER;public const int WM_CAP_STOP = WM_CAP_START + 68;public const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;public const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;public const int WM_CAP_SAVEDIB = WM_CAP_START + 25;public const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;public const int WM_CAP_SEQUENCE = WM_CAP_START + 62;public const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;public const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;public const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;public const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;public const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;public const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;public const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;public const int WM_CAP_SET_SCALE = WM_CAP_START + 53;public const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;[StructLayout(LayoutKind.Sequential)]public struct VIDEOHDR{[MarshalAs(UnmanagedType.I4)]public int lpData;[MarshalAs(UnmanagedType.I4)]public int dwBufferLength;[MarshalAs(UnmanagedType.I4)]public int dwBytesUsed;[MarshalAs(UnmanagedType.I4)]public int dwTimeCaptured;[MarshalAs(UnmanagedType.I4)]public int dwUser;[MarshalAs(UnmanagedType.I4)]public int dwFlags;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]public int[] dwReserved;}[StructLayout(LayoutKind.Sequential)]public struct BITMAPINFOHEADER{[MarshalAs(UnmanagedType.I4)]public Int32 biSize;[MarshalAs(UnmanagedType.I4)]public Int32 biWidth;[MarshalAs(UnmanagedType.I4)]public Int32 biHeight;[MarshalAs(UnmanagedType.I2)]public short biPlanes;[MarshalAs(UnmanagedType.I2)]public short biBitCount;[MarshalAs(UnmanagedType.I4)]public Int32 biCompression;[MarshalAs(UnmanagedType.I4)]public Int32 biSizeImage;[MarshalAs(UnmanagedType.I4)]public Int32 biXPelsPerMeter;[MarshalAs(UnmanagedType.I4)]public Int32 biYPelsPerMeter;[MarshalAs(UnmanagedType.I4)]public Int32 biClrUsed;[MarshalAs(UnmanagedType.I4)]public Int32 biClrImportant;}[StructLayout(LayoutKind.Sequential)]public struct BITMAPINFO{[MarshalAs(UnmanagedType.Struct, SizeConst = 40)]public BITMAPINFOHEADER bmiHeader;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]public Int32[] bmiColors;}public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);public static object GetStructure(IntPtr ptr, ValueType structure){return Marshal.PtrToStructure(ptr, structure.GetType());}public static object GetStructure(int ptr, ValueType structure){return GetStructure(new IntPtr(ptr), structure);}public static void Copy(IntPtr ptr, byte[] data){Marshal.Copy(ptr, data, 0, data.Length);}public static void Copy(int ptr, byte[] data){Copy(new IntPtr(ptr), data);}public static int SizeOf(object structure){return Marshal.SizeOf(structure);}}
}Form1.cs类文件using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace SoundVideo
{public partial class Form1 : Form{Camera wc;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;//panelPreview.Size = new Size(330,330);wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnPlay_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnScroll_Click(object sender, EventArgs e){try{wc.capImage(wc.lwndC, "d://test.bmp");}catch{MessageBox.Show("抓图有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStopCap_Click(object sender, EventArgs e){try{wc.stopCapScope(wc.lwndC);}catch{MessageBox.Show("停止摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStartCap_Click(object sender, EventArgs e){try{wc.capScope(wc.lwndC, "d://test.avi");}catch{MessageBox.Show("开始摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnClose_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = true;this.btnClose.Enabled = false;wc.CloseCamera();}catch{MessageBox.Show("关闭摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}
}using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace SoundVideo
{public partial class Form1 : Form{Camera wc;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;//panelPreview.Size = new Size(330,330);wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnPlay_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = false;this.btnClose.Enabled = true;wc = new Camera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);wc.StartCamera();}catch{MessageBox.Show("打开摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnScroll_Click(object sender, EventArgs e){try{wc.capImage(wc.lwndC, "d://test.bmp");}catch{MessageBox.Show("抓图有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStopCap_Click(object sender, EventArgs e){try{wc.stopCapScope(wc.lwndC);}catch{MessageBox.Show("停止摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnStartCap_Click(object sender, EventArgs e){try{wc.capScope(wc.lwndC, "d://test.avi");}catch{MessageBox.Show("开始摄像有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void btnClose_Click(object sender, EventArgs e){try{this.btnPlay.Enabled = true;this.btnClose.Enabled = false;wc.CloseCamera();}catch{MessageBox.Show("关闭摄像头有误,请检查", "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}
}Form1.Designer.cs类文件namespace SoundVideo
{partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.panel1 = new System.Windows.Forms.Panel();this.btnStartCap = new System.Windows.Forms.Button();this.btnStopCap = new System.Windows.Forms.Button();this.btnScroll = new System.Windows.Forms.Button();this.btnPlay = new System.Windows.Forms.Button();this.btnClose = new System.Windows.Forms.Button();this.panelPreview = new System.Windows.Forms.Panel();this.panel2 = new System.Windows.Forms.Panel();this.panel1.SuspendLayout();this.panel2.SuspendLayout();this.SuspendLayout();//// panel1//this.panel1.Controls.Add(this.panel2);this.panel1.Controls.Add(this.panelPreview);this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;this.panel1.Location = new System.Drawing.Point(0, 0);this.panel1.Name = "panel1";this.panel1.Size = new System.Drawing.Size(518, 487);this.panel1.TabIndex = 0;//// btnStartCap//this.btnStartCap.Location = new System.Drawing.Point(51, 3);this.btnStartCap.Name = "btnStartCap";this.btnStartCap.Size = new System.Drawing.Size(75, 23);this.btnStartCap.TabIndex = 0;this.btnStartCap.Text = "开始录像";this.btnStartCap.UseVisualStyleBackColor = true;this.btnStartCap.Click += new System.EventHandler(this.btnStartCap_Click);//// btnStopCap//this.btnStopCap.Location = new System.Drawing.Point(132, 3);this.btnStopCap.Name = "btnStopCap";this.btnStopCap.Size = new System.Drawing.Size(75, 23);this.btnStopCap.TabIndex = 1;this.btnStopCap.Text = "停止录像";this.btnStopCap.UseVisualStyleBackColor = true;this.btnStopCap.Click += new System.EventHandler(this.btnStopCap_Click);//// btnScroll//this.btnScroll.Location = new System.Drawing.Point(213, 3);this.btnScroll.Name = "btnScroll";this.btnScroll.Size = new System.Drawing.Size(75, 23);this.btnScroll.TabIndex = 2;this.btnScroll.Text = "抓图";this.btnScroll.UseVisualStyleBackColor = true;this.btnScroll.Click += new System.EventHandler(this.btnScroll_Click);//// btnPlay//this.btnPlay.Location = new System.Drawing.Point(294, 3);this.btnPlay.Name = "btnPlay";this.btnPlay.Size = new System.Drawing.Size(75, 23);this.btnPlay.TabIndex = 3;this.btnPlay.Text = "播放";this.btnPlay.UseVisualStyleBackColor = true;this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);//// btnClose//this.btnClose.Location = new System.Drawing.Point(375, 3);this.btnClose.Name = "btnClose";this.btnClose.Size = new System.Drawing.Size(75, 23);this.btnClose.TabIndex = 4;this.btnClose.Text = "关闭";this.btnClose.UseVisualStyleBackColor = true;this.btnClose.Click += new System.EventHandler(this.btnClose_Click);//// panelPreview//this.panelPreview.Dock = System.Windows.Forms.DockStyle.Fill;this.panelPreview.Location = new System.Drawing.Point(0, 0);this.panelPreview.Name = "panelPreview";this.panelPreview.Size = new System.Drawing.Size(518, 487);this.panelPreview.TabIndex = 5;//// panel2//this.panel2.Controls.Add(this.btnStartCap);this.panel2.Controls.Add(this.btnStopCap);this.panel2.Controls.Add(this.btnClose);this.panel2.Controls.Add(this.btnScroll);this.panel2.Controls.Add(this.btnPlay);this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;this.panel2.Location = new System.Drawing.Point(0, 448);this.panel2.Name = "panel2";this.panel2.Size = new System.Drawing.Size(518, 39);this.panel2.TabIndex = 6;//// Form1//this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(518, 487);this.Controls.Add(this.panel1);this.Name = "Form1";this.Text = "Form1";this.Load += new System.EventHandler(this.Form1_Load);this.panel1.ResumeLayout(false);this.panel2.ResumeLayout(false);this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.Panel panel1;private System.Windows.Forms.Button btnClose;private System.Windows.Forms.Button btnPlay;private System.Windows.Forms.Button btnScroll;private System.Windows.Forms.Button btnStopCap;private System.Windows.Forms.Button btnStartCap;private System.Windows.Forms.Panel panelPreview;private System.Windows.Forms.Panel panel2;}
}
c# 2.0实现摄象头视频采集,拍照,录象相关推荐
- 使用OPENNI2来对Kinect2.0进行.ONI格式视频采集
基于前两篇博客的基础上,可以对Kinect2.0进行ONI格式的视频采集了. 采集程序如下 Status CCaptrueThread::gr_init_kinect(CString videoPat ...
- 对话美摄科技侯康:提升技术,拓展场景 美摄智能汽车视频处理方案已就位
美摄科技成立于2014年,是一家专注智能视音频整体解决方案的国家高新技术企业,致力于视音频与AI技术的融合与创新,目前已服务海内外数千家企业客户.在视音频领域深耕多年,美摄科技凭借雄厚的技术实力,在当 ...
- 接入微信自定义版交易组件3.0,小程序对接视频号操作说明
一.功能介绍 应微信视频号要求,2022.7.1号起,商家必须要升级/开通交易组件3.0版本,才可在视频号场景下继续进行推广.可按此操作说明接入或升级到自定义交易组件3.0版本,实现视频号和微信小程序 ...
- Ubuntu安装MySQL 8.0 - APT(结尾附视频)
写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...
- MS2131 USB 3.0 高清音视频采集+HDMI 环出+混音处理芯片 应用网络直播一体机
MS2131 是一款 USB 3.0 高清视频和音频采集处理芯片,内部集成 USB 3.0 Device 控制器. 数据收发模块.音视频处理模块. MS2131 可以通过 USB 3.0 接口将 HD ...
- FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...
- FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.详细设计方案 5.vivad ...
- 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...
- DM642 视频采集基本架构
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 当前位置: 主页> ...
最新文章
- IT职场人生系列之十八:危险职业(上)
- 前端基础--jquery操作元素
- 解题报告 poj 3207
- 用scheme重写Python的三大函数map reduce 和filter
- BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
- inner join on, left join on, right join on的区别与介绍
- JAVA中限制接口流量、并发的方法
- 即将直播:新一代大数据技术构建PB级云端数仓实践
- 强迫症告辞!三星Galaxy S11这“凌乱”的后置5摄,感受下
- Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类
- 基于stm32的太阳跟踪装置设计与制作
- take credit for用法
- 交友网站界面设计+数据库设计
- python爬虫系列序
- Android多语言切换(兼容安卓9、10)
- 学习python的第十四天
- python二分法排序_「二分法排序」插入排序之二分法插入排序 - seo实验室
- 分析symbian软件总结笔记
- 【C++心路历程18】NOIP2016的心路历程
- mysql创表的工种_[MySQL基础]七、连接查询
热门文章
- 大数据数据科学家常用面试题_进行数据科学工作面试
- ios android 交互 区别,很多人不承认:iOS的返回交互,对比Android就是反人类。
- linux分辨率和用户有关吗,Linux系统在高分屏非正常分辨率显示
- leetcode 1486. 数组异或操作(位运算)
- leetcode 153. 寻找旋转排序数组中的最小值(二分查找)
- qq群 voiceover_如何在iOS上使用VoiceOver为所有人构建应用程序
- udacity开源的数据_评论:Udacity数据分析师纳米学位计划
- 了解ES6 The Dope Way第三部分:模板文字,扩展运算符和生成器!
- 文本训练集_训练文本中的不稳定性
- python处理excel文件(xls和xlsx)