504 lines
21 KiB
C#
504 lines
21 KiB
C#
using AForge.Controls;
|
||
using AForge.Video.DirectShow;
|
||
using System;
|
||
using System.ComponentModel;
|
||
using System.Diagnostics;
|
||
using System.Drawing;
|
||
using System.Drawing.Drawing2D;
|
||
using System.Drawing.Imaging;
|
||
using System.IO;
|
||
using System.Net.NetworkInformation;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading;
|
||
using System.Windows.Forms;
|
||
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
|
||
|
||
namespace photo
|
||
{
|
||
public partial class Photo_Form2 : Form
|
||
{
|
||
//250 350
|
||
private FilterInfoCollection videoDevices;//所有摄像设备
|
||
|
||
private VideoCaptureDevice videoDevice;//摄像设备
|
||
|
||
private VideoCapabilities[] videoCapabilities;//摄像头分辨率
|
||
|
||
public string img64 = "";
|
||
|
||
public int iActualHeight = 0;//视频流窗口高度
|
||
|
||
public int iActualWidth = 0;//视频流窗口宽度
|
||
|
||
//PaintEventArgs e11;
|
||
|
||
public Photo_Form2()
|
||
{
|
||
this.StartPosition = FormStartPosition.CenterScreen;//居中显示
|
||
|
||
InitializeComponent();
|
||
|
||
Get_Shebei();//得到机器所有接入的摄像设备
|
||
|
||
Conn_Camera();//连接摄像头
|
||
}
|
||
|
||
public void Get_Shebei()
|
||
{
|
||
//寻找设备的摄像头,检索分辨率
|
||
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
|
||
if (videoDevices.Count != 0)//读取到摄像设备
|
||
{
|
||
foreach (FilterInfo device in videoDevices)
|
||
{
|
||
cboVideo.Items.Add(device.Name);//把摄像设备添加到摄像列表中
|
||
}
|
||
}
|
||
else
|
||
{
|
||
cboVideo.Items.Add("没有找到摄像头");
|
||
}
|
||
|
||
cboVideo.SelectedIndex = 0; //默认选择第一个
|
||
|
||
if (videoDevices.Count != 0) //读取到摄像设备
|
||
{
|
||
//获取摄像头
|
||
videoDevice = new VideoCaptureDevice(videoDevices[cboVideo.SelectedIndex].MonikerString);
|
||
|
||
GetDeviceResolution(videoDevice); //获得摄像头的分辨率
|
||
}
|
||
}
|
||
|
||
//点击确定按钮
|
||
private void btn_queding_Click(object sender, EventArgs e)
|
||
{
|
||
DisConnect();//断开连接
|
||
|
||
EnableControlStatus(true);
|
||
|
||
this.Close();//关闭窗体
|
||
}
|
||
|
||
//点击拍照按钮
|
||
private void btn_paizhao_Click(object sender, EventArgs e)
|
||
{
|
||
try
|
||
{
|
||
if (videoSourcePlayer1 == null)
|
||
{
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
while (true)
|
||
{
|
||
//i++;
|
||
//创建图像对象
|
||
Bitmap img = videoSourcePlayer1.GetCurrentVideoFrame();//拍照
|
||
|
||
Bitmap imgbitmap = new Bitmap(img);
|
||
//Image resizedImage = resizeImage(imgbitmap, new Size(640, 360));//250 350
|
||
Image resizedImage = resizeImage(imgbitmap, new Size(iActualWidth, iActualHeight));
|
||
|
||
//pictureBox2.Image = img;
|
||
|
||
//保存
|
||
//string path = "C:\\PhotoList\\DengJi";
|
||
//if (!Directory.Exists(path))
|
||
//{
|
||
// Directory.CreateDirectory(path);
|
||
//}
|
||
//path += "\\" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg";
|
||
|
||
//img.Save(path, ImageFormat.Jpeg);
|
||
|
||
////计算图片多大
|
||
//int Img_Height = videoCapabilities[0].FrameSize.Height;
|
||
//int Img_Width = videoCapabilities[0].FrameSize.Width;
|
||
|
||
//Image originImage = Image.FromFile(path);
|
||
|
||
//创建矩形对象表示原图上裁剪的矩形区域,这里相当于划定原图上坐标为(10, 10)处,50x50大小的矩形区域为裁剪区域
|
||
//Rectangle cropRegion = new Rectangle(255, 30, 400, 500);
|
||
//Rectangle cropRegion = new Rectangle(250, 30, 180, 300);
|
||
int iY = Convert.ToInt32(iActualHeight / 1.4);
|
||
int iX = (iActualWidth - iY) / 2;
|
||
Rectangle cropRegion = new Rectangle(iX, 0, iY, iActualHeight);
|
||
//创建空白画布,大小为裁剪区域大小
|
||
Bitmap result = new Bitmap(cropRegion.Width, cropRegion.Height);
|
||
//创建Graphics对象,并指定要在result(目标图片画布)上绘制图像
|
||
Graphics graphics = Graphics.FromImage(result);
|
||
//使用Graphics对象把原图指定区域图像裁剪下来并填充进刚刚创建的空白画布
|
||
graphics.DrawImage(resizedImage, new Rectangle(0, 0, cropRegion.Width, cropRegion.Height), cropRegion, GraphicsUnit.Pixel);
|
||
//这个时候裁剪区域图片就被填充进result对象中去了,可以对其进行保存
|
||
//string path12 = "C:\\PhotoList\\DengJi\\" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg";
|
||
//result.Save(path12, ImageFormat.Png);
|
||
|
||
pictureBox1.Image = result;
|
||
|
||
//返回前端
|
||
MemoryStream ms = new MemoryStream();
|
||
result.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
|
||
byte[] photo = ms.GetBuffer();
|
||
ms.Close();
|
||
|
||
//FileStream fs = new FileStream(path12, FileMode.Open, FileAccess.Read);
|
||
//byte[] photo = new byte[fs.Length];
|
||
//fs.Read(photo, 0, photo.Length);
|
||
//fs.Close();
|
||
img64 = Convert.ToBase64String(photo);
|
||
img64 = "data:image/jpeg;base64," + img64;
|
||
break;
|
||
|
||
#region MyRegion
|
||
////原图片文件
|
||
//Image fromImage = Image.FromFile(fromImagePath);
|
||
////创建新图位图
|
||
//Bitmap bitmap = new Bitmap(width, height);
|
||
////创建作图区域
|
||
//Graphics graphic = Graphics.FromImage(bitmap);
|
||
////截取原图相应区域写入作图区
|
||
//graphic.DrawImage(fromImage, 0, 0, new Rectangle(offsetX, offsetY, width, height), GraphicsUnit.Pixel);
|
||
////从作图区生成新图
|
||
//Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
|
||
////保存图片
|
||
//saveImage.Save(toImagePath, ImageFormat.Png);
|
||
////释放资源
|
||
//saveImage.Dispose();
|
||
//graphic.Dispose();
|
||
//bitmap.Dispose();
|
||
#endregion
|
||
}
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
throw;
|
||
}
|
||
}
|
||
|
||
public void Conn_Camera()
|
||
{
|
||
if (videoDevice != null)//如果摄像头不为空
|
||
{
|
||
videoDevice.VideoResolution = videoCapabilities[comboBox2.SelectedIndex];//摄像头分辨率
|
||
|
||
videoSourcePlayer1.Size = new System.Drawing.Size(iActualWidth, iActualHeight);//保证画线时大小统一
|
||
|
||
videoSourcePlayer1.VideoSource = videoDevice;//把摄像头赋给控件
|
||
|
||
videoSourcePlayer1.Start();//开启摄像头
|
||
|
||
EnableControlStatus(false);
|
||
}
|
||
}
|
||
|
||
//关闭并释放
|
||
private void DisConnect()
|
||
{
|
||
if (videoSourcePlayer1.VideoSource != null)
|
||
{
|
||
videoSourcePlayer1.SignalToStop();
|
||
videoSourcePlayer1.WaitForStop();
|
||
videoSourcePlayer1.VideoSource = null;
|
||
}
|
||
}
|
||
|
||
//控件的显示切换
|
||
private void EnableControlStatus(bool status)
|
||
{
|
||
//cboVideo.Enabled = status;
|
||
//pictureBox1.Enabled = status;
|
||
//videoSourcePlayer1.Enabled = status;
|
||
//videoSourcePlayer1.Enabled = !status;
|
||
//btnCut.Enabled = !status;
|
||
}
|
||
|
||
//获得摄像头的分辨率
|
||
private void GetDeviceResolution(VideoCaptureDevice videoCaptureDevice)
|
||
{
|
||
comboBox2.Items.Clear();//清空列表
|
||
videoCapabilities = videoCaptureDevice.VideoCapabilities;//设备的摄像头分辨率数组
|
||
foreach (VideoCapabilities capabilty in videoCapabilities)
|
||
{
|
||
//把这个设备的所有分辨率添加到列表
|
||
comboBox2.Items.Add($"{capabilty.FrameSize.Width} x {capabilty.FrameSize.Height}");
|
||
}
|
||
comboBox2.SelectedIndex = 0;//默认选择第一个
|
||
SetVideoSourcePlayer1Size(videoCapabilities[0].FrameSize.Width, videoCapabilities[0].FrameSize.Height);
|
||
}
|
||
|
||
//设置视频流窗口大小
|
||
private void SetVideoSourcePlayer1Size(int iWidth, int iHeight)
|
||
{
|
||
while (iWidth > 500)
|
||
{
|
||
iWidth = iWidth / 2;
|
||
iHeight = iHeight / 2;
|
||
}
|
||
videoSourcePlayer1.Width = iWidth;
|
||
videoSourcePlayer1.Height = iHeight;
|
||
iActualWidth = iWidth;
|
||
iActualHeight = iHeight;
|
||
|
||
pictureBox1.Height = iActualHeight;
|
||
pictureBox1.Width = Convert.ToInt32(iActualHeight / 1.4);//1寸照片
|
||
}
|
||
|
||
public static Image resizeImage(Image imgToResize, Size size)
|
||
{
|
||
return (Image)(new Bitmap(imgToResize, size));
|
||
}
|
||
|
||
public static void image(string Path1)
|
||
{
|
||
System.Drawing.Image img = System.Drawing.Image.FromFile(Path1);
|
||
Bitmap bt = new Bitmap(img);
|
||
//获取图片位置颜色
|
||
Color cl = bt.GetPixel(10, 10);
|
||
int Width = img.Width;
|
||
int Height = img.Height;
|
||
int marginx = Height / 2;
|
||
float dpiX = img.HorizontalResolution;
|
||
float dpiY = img.VerticalResolution;
|
||
//设置新图的大小
|
||
Bitmap bitmap = new Bitmap(Width, Width, PixelFormat.Format24bppRgb);
|
||
//设置位图文件的水平和垂直分辨率,与Img一致
|
||
bitmap.SetResolution(dpiX, dpiY);
|
||
//在位图文件上填充一个新图
|
||
Graphics graphics = Graphics.FromImage(bitmap);
|
||
System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(0, 0, Width, Width);
|
||
//定义颜色
|
||
SolidBrush mySolidBrush = new SolidBrush(cl);
|
||
//将新图填充为获取原图位置的颜色
|
||
graphics.FillRectangle(mySolidBrush, Rec);
|
||
//向新图中填充Img
|
||
graphics.DrawImage(img, 0, marginx, Rec, GraphicsUnit.Pixel);
|
||
graphics.Dispose();
|
||
GC.Collect();
|
||
bitmap.Save("保存图片路径", System.Drawing.Imaging.ImageFormat.Jpeg);
|
||
}
|
||
|
||
private void videoSourcePlayer1_Paint(object sender, PaintEventArgs e)
|
||
{
|
||
////画矩形
|
||
Graphics g1 = e.Graphics;
|
||
Pen p2 = new Pen(Color.White, 2);
|
||
p2.DashStyle = DashStyle.Dot;
|
||
//g1.DrawRectangle(p2, 96, 0, 128, 180);
|
||
//g1.DrawRectangle(p2, 124, 0, 178, 250);
|
||
int iY = Convert.ToInt32(iActualHeight / 1.4);
|
||
int iX = (iActualWidth - iY) / 2;
|
||
g1.DrawRectangle(p2, iX, 0, iY, iActualHeight);
|
||
|
||
/* Graphics g1 = e.Graphics;
|
||
|
||
//使绘图质量最高,即消除锯齿
|
||
g1.SmoothingMode = SmoothingMode.AntiAlias;
|
||
g1.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||
g1.CompositingQuality = CompositingQuality.HighQuality;
|
||
|
||
Pen p = new Pen(Color.Blue, 1);//定义笔的颜色为蓝色,大小为2
|
||
Brush fillBrush = new SolidBrush(Color.White);
|
||
|
||
////画直线
|
||
//g1.DrawLine(p, 200, 10, 300, 10);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
|
||
|
||
////画虚线
|
||
Pen px = new Pen(Color.White, 2);//定义笔的颜色为蓝色,大小为2
|
||
px.DashStyle = DashStyle.Dot;//定义虚线的样式为点
|
||
//g1.DrawLine(px, 200, 20, 300, 20);
|
||
|
||
////自定义虚线
|
||
//Pen pd = new Pen(Color.Black, 5);//定义笔的颜色为蓝色,大小为2
|
||
//pd.DashPattern = new float[] { 2, 1 };//设置短划线和空白部分的数组
|
||
//g1.DrawLine(pd, 200, 30, 300, 30);
|
||
|
||
////画箭头,只对不封闭曲线有用
|
||
//pd.DashStyle = DashStyle.Solid;//恢复实线
|
||
//pd.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头
|
||
//g1.DrawLine(pd, 200, 50, 300, 50);
|
||
|
||
//画圆
|
||
g1.DrawEllipse(px, 140, 40, 140, 140);//与椭圆相贴的矩形的坐标,椭圆的长轴,椭圆的短轴*/
|
||
//单色填充圆
|
||
//g1.FillEllipse(fillBrush, 100, 40, 140, 140);
|
||
|
||
////画矩形
|
||
//Pen p2 = new Pen(Color.Yellow, 4);
|
||
//g1.DrawRectangle(p2, 0, 310, 100, 100);
|
||
|
||
////用渐变色填充
|
||
//Rectangle rect = new Rectangle(300, 60, 50, 50);//定义矩形,参数为起点横纵坐标以及其长和宽
|
||
//rect.Location = new Point(330, 20);
|
||
//LinearGradientBrush b3 = new LinearGradientBrush(rect, Color.Yellow, Color.Black, LinearGradientMode.Horizontal);
|
||
//g1.FillRectangle(b3, rect);
|
||
|
||
////用图片填充
|
||
////TextureBrush b2 = new TextureBrush(Image.FromFile(@"e:\picture\1.jpg"));
|
||
////rect.Location = new Point(10, 70);//更改这个矩形的起点坐标
|
||
////rect.Width = 200;//更改这个矩形的宽来
|
||
////rect.Height = 200;//更改这个矩形的高
|
||
////g1.FillRectangle(b2, rect);
|
||
|
||
////绘制字符串
|
||
//g1.DrawString("绘制文字", new Font("微软雅黑", 10), fillBrush, new PointF(130, 10));
|
||
|
||
////画多边形
|
||
//Point[] pg = { new Point(0, 76),
|
||
// new Point(80, 76),
|
||
// new Point(106, 0),
|
||
// new Point(130, 76),
|
||
// new Point(210, 76),
|
||
// new Point(146, 124),
|
||
// new Point(170, 200),
|
||
// new Point(106, 152),
|
||
// new Point(40, 200),
|
||
// new Point(66, 124),
|
||
//};
|
||
//g1.DrawPolygon(p, pg);
|
||
|
||
////画三维饼状图
|
||
//int width = 200;
|
||
//int height = 100;
|
||
//int x = 440;
|
||
//int y = 20;
|
||
//Rectangle r = new Rectangle(x, y, width, height);
|
||
//Pen p3 = new Pen(Color.Gray);
|
||
//for (int i = y; i < 3 * y; i++)
|
||
//{
|
||
// Rectangle tempR = new Rectangle(x, i, width, height);
|
||
// g1.DrawEllipse(p3, tempR);
|
||
//}
|
||
|
||
//Brush b = new SolidBrush(Color.Gainsboro);
|
||
//g1.FillPie(b, r, 0, 360);//笔刷,基础矩形,扫过的角
|
||
//b = new SolidBrush(Color.Blue);
|
||
//g1.FillPie(b, r, 60, 150);
|
||
//b = new SolidBrush(Color.Yellow);
|
||
//g1.FillPie(b, r, 210, 150);//从210°开始掠过150度
|
||
|
||
//Bitmap image = new Bitmap(500, 500);
|
||
//Graphics g = Graphics.FromImage(image);
|
||
//g.DrawEllipse(p, 200, 90, 100, 100);//与椭圆相贴的矩形的坐标,椭圆的长轴,椭圆的短轴
|
||
////单色填充圆
|
||
//g.FillEllipse(fillBrush, 200, 90, 100, 100);
|
||
////image.Save(@"c:\1.jpg");
|
||
#region 显示
|
||
//pictureBox1.Image = (Image)image;
|
||
//pictureBox1.Image.Save(@"c:\1.jpg");
|
||
//pictureBox1.Show();
|
||
|
||
#endregion
|
||
//g1.Dispose();//释放由Graphics使用的资源
|
||
//p.Dispose();
|
||
}
|
||
|
||
#region
|
||
//protected override void OnPaint(PaintEventArgs e)
|
||
//{
|
||
|
||
// base.OnPaint(e);
|
||
|
||
// int width = this.Width;
|
||
// int height = this.Height;
|
||
// int radius = width < height ? width : height;//以最短的边最为圆的直径
|
||
// Graphics graphics = this.CreateGraphics();
|
||
// //graphics.Clear( Color .FromArgb (255,240,240,240) );
|
||
// Rectangle rectangle = new Rectangle(0, 0, radius, radius);
|
||
|
||
|
||
// graphics.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
|
||
// Brush brush = new SolidBrush(Color.Blue);//指定画刷的颜色
|
||
// graphics.FillEllipse(brush, new Rectangle(0, 0, radius, radius));//填充一个圆
|
||
|
||
|
||
// Pen pen = new Pen(Color.Black, 2);//指定画笔的颜色和线宽
|
||
// graphics.DrawEllipse(pen, rectangle);//绘制圆的边界
|
||
|
||
// string text = this.Text;
|
||
// brush = new SolidBrush(Color.Black);//指定画刷画文本的颜色
|
||
|
||
// Font font = this.Font;
|
||
|
||
// StringFormat sf = new StringFormat();
|
||
// sf.Alignment = StringAlignment.Center;//字符水平对齐方式
|
||
// sf.LineAlignment = StringAlignment.Center;//字符垂直对齐方式
|
||
// graphics.DrawString(text, font, brush, new RectangleF(0, 0, radius, radius), sf);
|
||
|
||
|
||
// #region 使控件的单击事件只在圆内触发,而不是在矩形控件范围内触发,消除在圆外和控件内的区域响应单机事件的bug
|
||
// System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
|
||
// path.AddEllipse(0, 0, radius, radius);
|
||
// this.Region = new Region(path);
|
||
// #endregion
|
||
|
||
|
||
// //font.Dispose();//当控件的size改变时,如果调用了 font.Dispose(),那么font.Height会报异常,因为没有重新实例化font类,导致DrawString会报参数无效,所以也可以不调用font.dispose,这样就可以不用捕获异常了
|
||
// brush.Dispose();
|
||
// pen.Dispose();
|
||
// graphics.Dispose();
|
||
|
||
//}
|
||
#endregion
|
||
|
||
|
||
//点击关闭按钮时触发此函数。
|
||
//This event happened when the user closing the main form.
|
||
private void MainForm_Closing(object sender, CancelEventArgs e)
|
||
{
|
||
DisConnect();//断开连接
|
||
|
||
}
|
||
|
||
private void Photo_Form2_Load(object sender, EventArgs e)
|
||
{
|
||
//regist the form closing event.
|
||
//注册窗体关闭事件。
|
||
this.FormClosing += new FormClosingEventHandler(MainForm_Closing);
|
||
}
|
||
//------2023-10-19 xulu 添加上传图片功能-------
|
||
private Thread invokeThread;
|
||
private OpenFileDialog openFileDialog1;
|
||
private DialogResult result;
|
||
private void button1_Click(object sender, EventArgs e)
|
||
{
|
||
openFileDialog1 = new OpenFileDialog();
|
||
openFileDialog1.Filter = "图片文件(*.jpg,*.png)|*.jpg;*.png";
|
||
invokeThread = new Thread(new ThreadStart(InvokeMethod));
|
||
invokeThread.SetApartmentState(ApartmentState.STA);
|
||
invokeThread.Start();
|
||
invokeThread.Join();
|
||
|
||
if (result == DialogResult.OK)
|
||
{
|
||
if (openFileDialog1.FileName != "")
|
||
{
|
||
string file = openFileDialog1.FileName;//文件夹路径
|
||
string path = file.Substring(file.LastIndexOf("\\") + 1); //格式化处理,提取文件名
|
||
//File.Copy(file, Application.StartupPath + "\\cai\\" + lujin, false); //复制到的目录切记要加文件名!!!
|
||
//PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //使图像拉伸或收缩,以适合PictureBox
|
||
this.pictureBox1.ImageLocation = file;
|
||
//返回前端
|
||
Bitmap bmp = new Bitmap(file);
|
||
MemoryStream ms = new MemoryStream();
|
||
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
|
||
byte[] arr = new byte[ms.Length];
|
||
ms.Position = 0;
|
||
ms.Read(arr, 0, (int)ms.Length);
|
||
ms.Close();
|
||
string base64string = Convert.ToBase64String(arr);
|
||
img64 = "data:image/jpeg;base64," + base64string;
|
||
}
|
||
|
||
}
|
||
}
|
||
private void InvokeMethod()
|
||
{
|
||
result = openFileDialog1.ShowDialog();
|
||
}
|
||
//-----------------------------------------------------
|
||
}
|
||
}
|