diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7a1777d7f..07f8e2c62 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -230,46 +230,57 @@ EndSelection:<<<<<<<4 // Try to get the best format, currently we support PNG and "others" IList formats = GetFormats(); if (formats.Contains("PNG")) { - Object pngObject = GetClipboardData("PNG"); - if (pngObject is MemoryStream) { - MemoryStream png_stream = pngObject as MemoryStream; - using (Image tmpImage = Image.FromStream(png_stream)) { - return ImageHelper.Clone(tmpImage); + try { + Object pngObject = GetClipboardData("PNG"); + if (pngObject is MemoryStream) { + MemoryStream png_stream = pngObject as MemoryStream; + if (png_stream != null && png_stream.Length > 0) { + using (Image tmpImage = Image.FromStream(png_stream)) { + return ImageHelper.Clone(tmpImage); + } + } } + } catch (Exception pngEx) { + LOG.Error("Problem retrieving PNG from clipboard.", pngEx); } } - // If the EnableSpecialDIBClipboardReader flag in the config is set, use the code from: - // http://www.thomaslevesque.com/2009/02/05/wpf-paste-an-image-from-the-clipboard/ - // to read the DeviceIndependentBitmap from the clipboard, this might fix bug 3576125 - if (config.EnableSpecialDIBClipboardReader && formats.Contains("DeviceIndependentBitmap")) { - MemoryStream ms = GetClipboardData("DeviceIndependentBitmap") as MemoryStream; - if (ms != null) { - byte[] dibBuffer = new byte[ms.Length]; - ms.Read(dibBuffer, 0, dibBuffer.Length); - BitmapInfoHeader infoHeader = BinaryStructHelper.FromByteArray(dibBuffer); - // Only use this code, when the biCommpression != 0 (BI_RGB) - if (infoHeader.biCompression != 0) { - int fileHeaderSize = Marshal.SizeOf(typeof(BitmapFileHeader)); - uint infoHeaderSize = infoHeader.biSize; - int fileSize = (int)(fileHeaderSize + infoHeader.biSize + infoHeader.biSizeImage); + // the DIB readed should solve the issue reported here: https://sourceforge.net/projects/greenshot/forums/forum/676083/topic/6354353/index/page/1 + try { + // If the EnableSpecialDIBClipboardReader flag in the config is set, use the code from: + // http://www.thomaslevesque.com/2009/02/05/wpf-paste-an-image-from-the-clipboard/ + // to read the DeviceIndependentBitmap from the clipboard, this might fix bug 3576125 + if (config.EnableSpecialDIBClipboardReader && formats.Contains(DataFormats.Dib)) { + MemoryStream ms = GetClipboardData(DataFormats.Dib) as MemoryStream; + if (ms != null && ms.Length > 0) { + byte[] dibBuffer = new byte[ms.Length]; + ms.Read(dibBuffer, 0, dibBuffer.Length); + BitmapInfoHeader infoHeader = BinaryStructHelper.FromByteArray(dibBuffer); + // Only use this code, when the biCommpression != 0 (BI_RGB) + if (infoHeader.biCompression != 0) { + int fileHeaderSize = Marshal.SizeOf(typeof(BitmapFileHeader)); + uint infoHeaderSize = infoHeader.biSize; + int fileSize = (int)(fileHeaderSize + infoHeader.biSize + infoHeader.biSizeImage); - BitmapFileHeader fileHeader = new BitmapFileHeader(); - fileHeader.bfType = BitmapFileHeader.BM; - fileHeader.bfSize = fileSize; - fileHeader.bfReserved1 = 0; - fileHeader.bfReserved2 = 0; - fileHeader.bfOffBits = (int)(fileHeaderSize + infoHeaderSize + infoHeader.biClrUsed * 4); + BitmapFileHeader fileHeader = new BitmapFileHeader(); + fileHeader.bfType = BitmapFileHeader.BM; + fileHeader.bfSize = fileSize; + fileHeader.bfReserved1 = 0; + fileHeader.bfReserved2 = 0; + fileHeader.bfOffBits = (int)(fileHeaderSize + infoHeaderSize + infoHeader.biClrUsed * 4); - byte[] fileHeaderBytes = BinaryStructHelper.ToByteArray(fileHeader); + byte[] fileHeaderBytes = BinaryStructHelper.ToByteArray(fileHeader); - using (MemoryStream msBitmap = new MemoryStream()) { - msBitmap.Write(fileHeaderBytes, 0, fileHeaderSize); - msBitmap.Write(dibBuffer, 0, dibBuffer.Length); - msBitmap.Seek(0, SeekOrigin.Begin); - return Image.FromStream(msBitmap); + using (MemoryStream msBitmap = new MemoryStream()) { + msBitmap.Write(fileHeaderBytes, 0, fileHeaderSize); + msBitmap.Write(dibBuffer, 0, dibBuffer.Length); + msBitmap.Seek(0, SeekOrigin.Begin); + return Image.FromStream(msBitmap); + } } } } + } catch (Exception dibEx) { + LOG.Error("Problem retrieving DIB from clipboard.", dibEx); } return Clipboard.GetImage(); } catch (Exception ee) {