mirror of
				https://github.com/2dust/v2rayN.git
				synced 2025-10-31 20:42:52 +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; | ||||||
| using QRCoder.Xaml; | using QRCoder.Xaml; | ||||||
|  | using System.Drawing; | ||||||
|  | using System.Windows.Interop; | ||||||
|  | using System.Windows; | ||||||
| using System.Windows.Media; | using System.Windows.Media; | ||||||
|  | using ZXing.Common; | ||||||
|  | using ZXing.QrCode; | ||||||
|  | using ZXing.Windows.Compatibility; | ||||||
|  | using ZXing; | ||||||
| 
 | 
 | ||||||
| namespace v2rayN | namespace v2rayN | ||||||
| { | { | ||||||
|  | @ -28,5 +35,70 @@ namespace v2rayN | ||||||
|                 return null; |                 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.Interop; | ||||||
| using System.Windows.Media; | using System.Windows.Media; | ||||||
| using System.Windows.Media.Imaging; | using System.Windows.Media.Imaging; | ||||||
| using ZXing; |  | ||||||
| using ZXing.Common; |  | ||||||
| using ZXing.QrCode; |  | ||||||
| using ZXing.Windows.Compatibility; |  | ||||||
| 
 | 
 | ||||||
| namespace v2rayN | namespace v2rayN | ||||||
| { | { | ||||||
|  | @ -950,66 +946,6 @@ namespace v2rayN | ||||||
| 
 | 
 | ||||||
|         #endregion TempPath |         #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 开机自动启动等 |         #region 开机自动启动等 | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  |  | ||||||
|  | @ -1026,10 +1026,10 @@ namespace v2rayN.ViewModels | ||||||
|         { |         { | ||||||
|             ShowHideWindow(false); |             ShowHideWindow(false); | ||||||
| 
 | 
 | ||||||
|             var dpiXY = Utils.GetDpiXY(Application.Current.MainWindow); |             var dpiXY = QRCodeHelper.GetDpiXY(Application.Current.MainWindow); | ||||||
|             string result = await Task.Run(() => |             string result = await Task.Run(() => | ||||||
|             { |             { | ||||||
|                 return Utils.ScanScreen(dpiXY.Item1, dpiXY.Item2); |                 return QRCodeHelper.ScanScreen(dpiXY.Item1, dpiXY.Item2); | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|             ShowHideWindow(true); |             ShowHideWindow(true); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 2dust
						2dust