mirror of
				https://github.com/2dust/v2rayN.git
				synced 2025-10-31 04:22:51 +00:00 
			
		
		
		
	Adjust Scan screen qrcode
This commit is contained in:
		
							parent
							
								
									c23379b3b6
								
							
						
					
					
						commit
						31267cbc33
					
				
					 3 changed files with 74 additions and 66 deletions
				
			
		|  | @ -1,6 +1,13 @@ | |||
| using QRCoder; | ||||
| using QRCoder.Xaml; | ||||
| using System.Drawing; | ||||
| using System.Windows.Interop; | ||||
| using System.Windows; | ||||
| using System.Windows.Media; | ||||
| using ZXing.Common; | ||||
| using ZXing.QrCode; | ||||
| using ZXing.Windows.Compatibility; | ||||
| using ZXing; | ||||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|  | @ -28,5 +35,70 @@ namespace v2rayN | |||
|                 return null; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public static string ScanScreen(float dpiX, float dpiY) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var left = (int)(SystemParameters.WorkArea.Left); | ||||
|                 var top = (int)(SystemParameters.WorkArea.Top); | ||||
|                 var width = (int)(SystemParameters.WorkArea.Width / dpiX); | ||||
|                 var height = (int)(SystemParameters.WorkArea.Height / dpiY); | ||||
| 
 | ||||
|                 using Bitmap fullImage = new Bitmap(width, height); | ||||
|                 using (Graphics g = Graphics.FromImage(fullImage)) | ||||
|                 { | ||||
|                     g.CopyFromScreen(left, top, 0, 0, fullImage.Size, CopyPixelOperation.SourceCopy); | ||||
|                 } | ||||
|                 int maxTry = 10; | ||||
|                 for (int i = 0; i < maxTry; i++) | ||||
|                 { | ||||
|                     int marginLeft = (int)((double)fullImage.Width * i / 2.5 / maxTry); | ||||
|                     int marginTop = (int)((double)fullImage.Height * i / 2.5 / maxTry); | ||||
|                     Rectangle cropRect = new(marginLeft, marginTop, fullImage.Width - marginLeft * 2, fullImage.Height - marginTop * 2); | ||||
|                     Bitmap target = new(width, height); | ||||
| 
 | ||||
|                     double imageScale = (double)width / (double)cropRect.Width; | ||||
|                     using (Graphics g = Graphics.FromImage(target)) | ||||
|                     { | ||||
|                         g.DrawImage(fullImage, new Rectangle(0, 0, target.Width, target.Height), | ||||
|                                         cropRect, | ||||
|                                         GraphicsUnit.Pixel); | ||||
|                     } | ||||
| 
 | ||||
|                     BitmapLuminanceSource source = new(target); | ||||
|                     QRCodeReader reader = new(); | ||||
| 
 | ||||
|                     BinaryBitmap bitmap = new(new HybridBinarizer(source)); | ||||
|                     var result = reader.decode(bitmap); | ||||
|                     if (result != null) | ||||
|                     { | ||||
|                         return result.Text; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         BinaryBitmap bitmap2 = new(new HybridBinarizer(source.invert())); | ||||
|                         var result2 = reader.decode(bitmap2); | ||||
|                         if (result2 != null) | ||||
|                         { | ||||
|                             return result2.Text; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 Logging.SaveLog(ex.Message, ex); | ||||
|             } | ||||
|             return string.Empty; | ||||
|         } | ||||
| 
 | ||||
|         public static Tuple<float, float> GetDpiXY(Window window) | ||||
|         { | ||||
|             IntPtr hWnd = new WindowInteropHelper(window).EnsureHandle(); | ||||
|             Graphics g = Graphics.FromHwnd(hWnd); | ||||
| 
 | ||||
|             return new(96 / g.DpiX, 96 / g.DpiY); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -18,10 +18,6 @@ using System.Windows; | |||
| using System.Windows.Interop; | ||||
| using System.Windows.Media; | ||||
| using System.Windows.Media.Imaging; | ||||
| using ZXing; | ||||
| using ZXing.Common; | ||||
| using ZXing.QrCode; | ||||
| using ZXing.Windows.Compatibility; | ||||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|  | @ -950,66 +946,6 @@ namespace v2rayN | |||
| 
 | ||||
|         #endregion TempPath | ||||
| 
 | ||||
|         #region scan screen | ||||
| 
 | ||||
|         public static string ScanScreen(float dpiX, float dpiY) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var left = (int)(SystemParameters.WorkArea.Left); | ||||
|                 var top = (int)(SystemParameters.WorkArea.Top); | ||||
|                 var width = (int)(SystemParameters.WorkArea.Width / dpiX); | ||||
|                 var height = (int)(SystemParameters.WorkArea.Height / dpiY); | ||||
| 
 | ||||
|                 using Bitmap fullImage = new Bitmap(width, height); | ||||
|                 using (Graphics g = Graphics.FromImage(fullImage)) | ||||
|                 { | ||||
|                     g.CopyFromScreen(left, top, 0, 0, fullImage.Size, CopyPixelOperation.SourceCopy); | ||||
|                 } | ||||
|                 int maxTry = 10; | ||||
|                 for (int i = 0; i < maxTry; i++) | ||||
|                 { | ||||
|                     int marginLeft = (int)((double)fullImage.Width * i / 2.5 / maxTry); | ||||
|                     int marginTop = (int)((double)fullImage.Height * i / 2.5 / maxTry); | ||||
|                     Rectangle cropRect = new(marginLeft, marginTop, fullImage.Width - marginLeft * 2, fullImage.Height - marginTop * 2); | ||||
|                     Bitmap target = new(width, height); | ||||
| 
 | ||||
|                     double imageScale = (double)width / (double)cropRect.Width; | ||||
|                     using (Graphics g = Graphics.FromImage(target)) | ||||
|                     { | ||||
|                         g.DrawImage(fullImage, new Rectangle(0, 0, target.Width, target.Height), | ||||
|                                         cropRect, | ||||
|                                         GraphicsUnit.Pixel); | ||||
|                     } | ||||
| 
 | ||||
|                     BitmapLuminanceSource source = new(target); | ||||
|                     BinaryBitmap bitmap = new(new HybridBinarizer(source)); | ||||
|                     QRCodeReader reader = new(); | ||||
|                     Result result = reader.decode(bitmap); | ||||
|                     if (result != null) | ||||
|                     { | ||||
|                         string ret = result.Text; | ||||
|                         return ret; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 Logging.SaveLog(ex.Message, ex); | ||||
|             } | ||||
|             return string.Empty; | ||||
|         } | ||||
| 
 | ||||
|         public static Tuple<float, float> GetDpiXY(Window window) | ||||
|         { | ||||
|             IntPtr hWnd = new WindowInteropHelper(window).EnsureHandle(); | ||||
|             Graphics g = Graphics.FromHwnd(hWnd); | ||||
| 
 | ||||
|             return new(96 / g.DpiX, 96 / g.DpiY); | ||||
|         } | ||||
| 
 | ||||
|         #endregion scan screen | ||||
| 
 | ||||
|         #region 开机自动启动等 | ||||
| 
 | ||||
|         /// <summary> | ||||
|  |  | |||
|  | @ -1026,10 +1026,10 @@ namespace v2rayN.ViewModels | |||
|         { | ||||
|             ShowHideWindow(false); | ||||
| 
 | ||||
|             var dpiXY = Utils.GetDpiXY(Application.Current.MainWindow); | ||||
|             var dpiXY = QRCodeHelper.GetDpiXY(Application.Current.MainWindow); | ||||
|             string result = await Task.Run(() => | ||||
|             { | ||||
|                 return Utils.ScanScreen(dpiXY.Item1, dpiXY.Item2); | ||||
|                 return QRCodeHelper.ScanScreen(dpiXY.Item1, dpiXY.Item2); | ||||
|             }); | ||||
| 
 | ||||
|             ShowHideWindow(true); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 2dust
						2dust