From 096c33656cc496076b7ba247ade4a060cca191bb Mon Sep 17 00:00:00 2001 From: RKrom Date: Mon, 20 Feb 2012 16:40:00 +0000 Subject: [PATCH] Fixed Transparency issues: always using transparent when the captured image is transparent, if not use the DWMBackgroundColor. (and fixed a compile error due to forgotten commit) git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@1671 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4 --- .../ExternalCommandDestination.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 9 +++++++ GreenshotPlugin/Core/WindowsHelper.cs | 24 +++++++++---------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index 029aade4e..aa1e1b171 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -74,7 +74,7 @@ namespace ExternalCommand { Image icon = null; if (File.Exists(config.commandlines[presetCommand])) { try { - icon = GetExeIcon(config.commandlines[presetCommand]); + icon = GetExeIcon(config.commandlines[presetCommand], 0); } catch{}; } iconCache.Add(presetCommand, icon); diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 5ea34b639..09ea3cda1 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -890,6 +890,15 @@ namespace GreenshotPlugin.Core { public static Bitmap Clone(Image sourceBitmap) { return CloneArea(sourceBitmap, Rectangle.Empty, PixelFormat.DontCare); } + /// + /// Wrapper for just cloning & TargetFormat which calls the CloneArea + /// + /// Image to clone + /// Target Format, use PixelFormat.DontCare if you want the original (or a default if the source PixelFormat is not supported) + /// Bitmap with clone image data + public static Bitmap Clone(Image sourceBitmap, PixelFormat targetFormat) { + return CloneArea(sourceBitmap, Rectangle.Empty, targetFormat); + } /// /// Clone an image, taking some rules into account: diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index a7aa760ee..4d94bdaad 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -876,11 +876,15 @@ namespace GreenshotPlugin.Core { // Remove corners if (!Image.IsAlphaPixelFormat(capturedBitmap.PixelFormat)) { LOG.Debug("Changing pixelformat to Alpha for the RemoveCorners"); - Bitmap tmpBitmap = capturedBitmap.Clone(new Rectangle(Point.Empty, capturedBitmap.Size), PixelFormat.Format32bppArgb); + Bitmap tmpBitmap = ImageHelper.Clone(capturedBitmap, PixelFormat.Format32bppArgb); capturedBitmap.Dispose(); capturedBitmap = tmpBitmap; } - RemoveCorners(capturedBitmap, redMask, windowCaptureMode, conf.DWMBackgroundColor); + Color cornerColor = Color.Transparent; + if (!Image.IsAlphaPixelFormat(capturedBitmap.PixelFormat)) { + cornerColor = Color.FromArgb(255, conf.DWMBackgroundColor.R, conf.DWMBackgroundColor.G, conf.DWMBackgroundColor.B); + } + RemoveCorners(capturedBitmap, redMask, cornerColor); } } } finally { @@ -912,12 +916,8 @@ namespace GreenshotPlugin.Core { /// /// The bitmap taken which would normally be returned to the editor etc. /// The bitmap taken with a red background - /// The capturemode so we can take transparency into accound - /// The background color - private void RemoveCorners(Bitmap normalBitmap, Bitmap redBitmap, WindowCaptureMode captureMode, Color destinationColor) { - if (captureMode == WindowCaptureMode.AeroTransparent) { - destinationColor = Color.Transparent; - } + /// The background color + private void RemoveCorners(Bitmap normalBitmap, Bitmap redBitmap, Color cornerColor) { using (BitmapBuffer redBuffer = new BitmapBuffer(redBitmap, false)) { redBuffer.Lock(); using (BitmapBuffer normalBuffer = new BitmapBuffer(normalBitmap, false)) { @@ -929,28 +929,28 @@ namespace GreenshotPlugin.Core { int cornerY = y; Color currentPixel = redBuffer.GetColorAt(cornerX, cornerY); if (currentPixel.R > 0 && currentPixel.G == 0 && currentPixel.B == 0) { - normalBuffer.SetColorAt(cornerX, cornerY, destinationColor); + normalBuffer.SetColorAt(cornerX, cornerY, cornerColor); } // top right cornerX = normalBitmap.Width - x; cornerY = y; currentPixel = redBuffer.GetColorAt(cornerX, cornerY); if (currentPixel.R > 0 && currentPixel.G == 0 && currentPixel.B == 0) { - normalBuffer.SetColorAt(cornerX, cornerY, destinationColor); + normalBuffer.SetColorAt(cornerX, cornerY, cornerColor); } // bottom right cornerX = normalBitmap.Width - x; cornerY = normalBitmap.Height - y; currentPixel = redBuffer.GetColorAt(cornerX, cornerY); if (currentPixel.R > 0 && currentPixel.G == 0 && currentPixel.B == 0) { - normalBuffer.SetColorAt(cornerX, cornerY, destinationColor); + normalBuffer.SetColorAt(cornerX, cornerY, cornerColor); } // bottom left cornerX = x; cornerY = normalBitmap.Height - y; currentPixel = redBuffer.GetColorAt(cornerX, cornerY); if (currentPixel.R > 0 && currentPixel.G == 0 && currentPixel.B == 0) { - normalBuffer.SetColorAt(cornerX, cornerY, destinationColor); + normalBuffer.SetColorAt(cornerX, cornerY, cornerColor); } } }