From 7eaac502c7831491b5b82103fe856cc5a700a908 Mon Sep 17 00:00:00 2001 From: Jaex Date: Sun, 8 May 2016 21:32:53 +0300 Subject: [PATCH] Apply drawings to all capture methods inside region capture --- .../Forms/RectangleRegionForm.cs | 33 ++++---- ShareX.ScreenCaptureLib/Forms/SurfaceForm.cs | 45 ++++++++++- ShareX/Forms/MainForm.cs | 78 +++++++------------ 3 files changed, 84 insertions(+), 72 deletions(-) diff --git a/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs b/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs index 275950a12..01fa4f103 100644 --- a/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs @@ -694,31 +694,26 @@ public void UpdateRegionPath() } } - public override Image GetResultImage() + protected override Image GetOutputImage() { - if (SurfaceImage != null) - { - if (AreaManager.DrawingShapes.Length > 0) - { - using (Bitmap bmp = new Bitmap(SurfaceImage)) - using (Graphics g = Graphics.FromImage(bmp)) - { - foreach (BaseDrawingShape shape in AreaManager.DrawingShapes) - { - if (shape != null) - { - shape.DrawOutput(g, bmp); - } - } + Image img = base.GetOutputImage(); - return ShapeCaptureHelpers.GetRegionImage(bmp, regionFillPath, regionDrawPath, Config); + if (AreaManager.DrawingShapes.Length > 0) + { + using (Bitmap bmpCopy = new Bitmap(img)) + using (Graphics g = Graphics.FromImage(img)) + { + foreach (BaseDrawingShape shape in AreaManager.DrawingShapes) + { + if (shape != null) + { + shape.DrawOutput(g, bmpCopy); + } } } - - return ShapeCaptureHelpers.GetRegionImage(SurfaceImage, regionFillPath, regionDrawPath, Config); } - return null; + return img; } protected override void Dispose(bool disposing) diff --git a/ShareX.ScreenCaptureLib/Forms/SurfaceForm.cs b/ShareX.ScreenCaptureLib/Forms/SurfaceForm.cs index 0dd9625f2..5a9fd40dc 100644 --- a/ShareX.ScreenCaptureLib/Forms/SurfaceForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/SurfaceForm.cs @@ -139,7 +139,7 @@ public virtual void Prepare() using (Bitmap darkBackground = (Bitmap)SurfaceImage.Clone()) using (Graphics g = Graphics.FromImage(darkBackground)) { - using (Brush brush = new SolidBrush(Color.FromArgb(50, Color.Black))) + using (Brush brush = new SolidBrush(Color.FromArgb(40, Color.Black))) { g.FillRectangle(brush, 0, 0, darkBackground.Width, darkBackground.Height); } @@ -260,7 +260,48 @@ protected override void OnPaint(PaintEventArgs e) public virtual Image GetResultImage() { - return ShapeCaptureHelpers.GetRegionImage(SurfaceImage, regionFillPath, regionDrawPath, Config); + if (Result == SurfaceResult.Region) + { + using (Image img = GetOutputImage()) + { + return ShapeCaptureHelpers.GetRegionImage(img, regionFillPath, regionDrawPath, Config); + } + } + else if (Result == SurfaceResult.Fullscreen) + { + return GetOutputImage(); + } + else if (Result == SurfaceResult.Monitor) + { + Screen[] screens = Screen.AllScreens; + + if (MonitorIndex < screens.Length) + { + Screen screen = screens[MonitorIndex]; + Rectangle screenRect = CaptureHelpers.ScreenToClient(screen.Bounds); + + using (Image img = GetOutputImage()) + { + return ImageHelpers.CropImage(img, screenRect); + } + } + } + else if (Result == SurfaceResult.ActiveMonitor) + { + Rectangle activeScreenRect = CaptureHelpers.GetActiveScreenBounds0Based(); + + using (Image img = GetOutputImage()) + { + return ImageHelpers.CropImage(img, activeScreenRect); + } + } + + return null; + } + + protected virtual Image GetOutputImage() + { + return (Image)SurfaceImage.Clone(); } public virtual WindowInfo GetWindowInfo() diff --git a/ShareX/Forms/MainForm.cs b/ShareX/Forms/MainForm.cs index 8af0ed570..206ee604a 100644 --- a/ShareX/Forms/MainForm.cs +++ b/ShareX/Forms/MainForm.cs @@ -2091,73 +2091,49 @@ private void CaptureRegion(CaptureType captureType, TaskSettings taskSettings, b DoCapture(() => { Image img = null; - Image screenshot = Screenshot.CaptureFullscreen(); + Image screenshot = null; try { + screenshot = Screenshot.CaptureFullscreen(); + surface.Config = taskSettings.CaptureSettingsReference.SurfaceOptions; surface.SurfaceImage = screenshot; surface.Prepare(); surface.ShowDialog(); - if (surface.Result == SurfaceResult.Region) - { - using (screenshot) - { - img = surface.GetResultImage(); - - if (taskSettings.UploadSettings.RegionCaptureUseWindowPattern) - { - WindowInfo windowInfo = surface.GetWindowInfo(); - - if (windowInfo != null) - { - img.Tag = new ImageTag - { - WindowTitle = windowInfo.Text, - ProcessName = windowInfo.ProcessName - }; - } - } - } - } - else if (surface.Result == SurfaceResult.Fullscreen) - { - img = screenshot; - } - else if (surface.Result == SurfaceResult.Monitor) - { - Screen[] screens = Screen.AllScreens; - - if (surface.MonitorIndex < screens.Length) - { - Screen screen = screens[surface.MonitorIndex]; - Rectangle screenRect = CaptureHelpers.ScreenToClient(screen.Bounds); - - using (screenshot) - { - img = ImageHelpers.CropImage(screenshot, screenRect); - } - } - } - else if (surface.Result == SurfaceResult.ActiveMonitor) - { - Rectangle activeScreenRect = CaptureHelpers.GetActiveScreenBounds0Based(); - - using (screenshot) - { - img = ImageHelpers.CropImage(screenshot, activeScreenRect); - } - } + img = surface.GetResultImage(); if (img != null) { + if (surface.Result == SurfaceResult.Region && taskSettings.UploadSettings.RegionCaptureUseWindowPattern) + { + WindowInfo windowInfo = surface.GetWindowInfo(); + + if (windowInfo != null) + { + img.Tag = new ImageTag + { + WindowTitle = windowInfo.Text, + ProcessName = windowInfo.ProcessName + }; + } + } + lastRegionCaptureType = LastRegionCaptureType.Surface; } } finally { - surface.Dispose(); + if (surface != null) + { + surface.Dispose(); + } + + if (screenshot != null) + { + screenshot.Dispose(); + } } return img;