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实现摄象头视频采集,拍照,录象相关推荐

  1. 使用OPENNI2来对Kinect2.0进行.ONI格式视频采集

    基于前两篇博客的基础上,可以对Kinect2.0进行ONI格式的视频采集了. 采集程序如下 Status CCaptrueThread::gr_init_kinect(CString videoPat ...

  2. 对话美摄科技侯康:提升技术,拓展场景 美摄智能汽车视频处理方案已就位

    美摄科技成立于2014年,是一家专注智能视音频整体解决方案的国家高新技术企业,致力于视音频与AI技术的融合与创新,目前已服务海内外数千家企业客户.在视音频领域深耕多年,美摄科技凭借雄厚的技术实力,在当 ...

  3. 接入微信自定义版交易组件3.0,小程序对接视频号操作说明

    一.功能介绍 应微信视频号要求,2022.7.1号起,商家必须要升级/开通交易组件3.0版本,才可在视频号场景下继续进行推广.可按此操作说明接入或升级到自定义交易组件3.0版本,实现视频号和微信小程序 ...

  4. Ubuntu安装MySQL 8.0 - APT(结尾附视频)

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  5. MS2131 USB 3.0 高清音视频采集+HDMI 环出+混音处理芯片 应用网络直播一体机

    MS2131 是一款 USB 3.0 高清视频和音频采集处理芯片,内部集成 USB 3.0 Device 控制器. 数据收发模块.音视频处理模块. MS2131 可以通过 USB 3.0 接口将 HD ...

  6. FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码

    目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...

  7. FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码

    目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.详细设计方案 5.vivad ...

  8. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  9. DM642 视频采集基本架构

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 当前位置: 主页> ...

最新文章

  1. IT职场人生系列之十八:危险职业(上)
  2. 前端基础--jquery操作元素
  3. 解题报告 poj 3207
  4. 用scheme重写Python的三大函数map reduce 和filter
  5. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
  6. inner join on, left join on, right join on的区别与介绍
  7. JAVA中限制接口流量、并发的方法
  8. 即将直播:新一代大数据技术构建PB级云端数仓实践
  9. 强迫症告辞!三星Galaxy S11这“凌乱”的后置5摄,感受下
  10. Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类
  11. 基于stm32的太阳跟踪装置设计与制作
  12. take credit for用法
  13. 交友网站界面设计+数据库设计
  14. python爬虫系列序
  15. Android多语言切换(兼容安卓9、10)
  16. 学习python的第十四天
  17. python二分法排序_「二分法排序」插入排序之二分法插入排序 - seo实验室
  18. 分析symbian软件总结笔记
  19. 【C++心路历程18】NOIP2016的心路历程
  20. mysql创表的工种_[MySQL基础]七、连接查询

热门文章

  1. 大数据数据科学家常用面试题_进行数据科学工作面试
  2. ios android 交互 区别,很多人不承认:iOS的返回交互,对比Android就是反人类。
  3. linux分辨率和用户有关吗,Linux系统在高分屏非正常分辨率显示
  4. leetcode 1486. 数组异或操作(位运算)
  5. leetcode 153. 寻找旋转排序数组中的最小值(二分查找)
  6. qq群 voiceover_如何在iOS上使用VoiceOver为所有人构建应用程序
  7. udacity开源的数据_评论:Udacity数据分析师纳米学位计划
  8. 了解ES6 The Dope Way第三部分:模板文字,扩展运算符和生成器!
  9. 文本训练集_训练文本中的不稳定性
  10. python处理excel文件(xls和xlsx)