From 40807d5d2b99aa19563df3699fa84661bf4481b1 Mon Sep 17 00:00:00 2001 From: RKrom Date: Wed, 14 Mar 2012 11:53:03 +0000 Subject: [PATCH] Fixed bug where the image exported to the Clipboard, Jira, Imgur or Confluence is bigger as it should be. The reason is that "MemoryStream.getBuffer()" returns the byte buffer for the stream, which is usually bigger (capacity) than the actual data!! git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@1702 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4 --- Greenshot/Helpers/ClipboardHelper.cs | 2 +- .../ConfluenceDestination.cs | 58 ++++++++-------- GreenshotImgurPlugin/ImgurPlugin.cs | 7 +- GreenshotImgurPlugin/ImgurUtils.cs | 4 +- GreenshotJiraPlugin/JiraDestination.cs | 68 ++++++++++--------- 5 files changed, 70 insertions(+), 69 deletions(-) diff --git a/Greenshot/Helpers/ClipboardHelper.cs b/Greenshot/Helpers/ClipboardHelper.cs index 47540779c..ed6d92669 100644 --- a/Greenshot/Helpers/ClipboardHelper.cs +++ b/Greenshot/Helpers/ClipboardHelper.cs @@ -315,7 +315,7 @@ EndSelection:<<<<<<<4 utf8EncodedHTMLString= utf8EncodedHTMLString.Replace("${width}", image.Width.ToString()); utf8EncodedHTMLString= utf8EncodedHTMLString.Replace("${height}", image.Height.ToString()); utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${format}", "png"); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${data}", Convert.ToBase64String(pngStream.GetBuffer())); + utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${data}", Convert.ToBase64String(pngStream.GetBuffer(),0, (int)pngStream.Length)); StringBuilder sb=new StringBuilder(); sb.Append(utf8EncodedHTMLString); sb.Replace("<<<<<<<1", (utf8EncodedHTMLString.IndexOf("") + "".Length).ToString("D8")); diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 4388c4972..d10ac2e29 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -141,40 +141,42 @@ namespace GreenshotConfluencePlugin { } private bool upload(Image image, Page page, string filename, bool openPage) { + byte[] buffer; using (MemoryStream stream = new MemoryStream()) { ConfluencePlugin.Host.SaveToStream(image, stream, config.UploadFormat, config.UploadJpegQuality); - byte [] buffer = stream.GetBuffer(); - try { - ConfluencePlugin.ConfluenceConnector.addAttachment(page.id, "image/" + config.UploadFormat.ToString().ToLower(), null, filename, buffer); - LOG.Debug("Uploaded to Confluence."); - if (config.CopyWikiMarkupForImageToClipboard) { - int retryCount = 2; - while (retryCount >= 0) { - try { - Clipboard.SetText("!" + filename + "!"); - break; - } catch (Exception ee) { - if (retryCount == 0) { - LOG.Error(ee); - } else { - Thread.Sleep(100); - } - } finally { - --retryCount; + // COPY buffer to array + buffer = stream.ToArray(); + } + try { + ConfluencePlugin.ConfluenceConnector.addAttachment(page.id, "image/" + config.UploadFormat.ToString().ToLower(), null, filename, buffer); + LOG.Debug("Uploaded to Confluence."); + if (config.CopyWikiMarkupForImageToClipboard) { + int retryCount = 2; + while (retryCount >= 0) { + try { + Clipboard.SetText("!" + filename + "!"); + break; + } catch (Exception ee) { + if (retryCount == 0) { + LOG.Error(ee); + } else { + Thread.Sleep(100); } + } finally { + --retryCount; } } - if (openPage) { - try { - Process.Start(page.Url); - } catch {} - } else { - System.Windows.MessageBox.Show(lang.GetString(LangKey.upload_success)); - } - return true; - } catch(Exception e) { - System.Windows.MessageBox.Show(lang.GetString(LangKey.upload_failure) + " " + e.Message); } + if (openPage) { + try { + Process.Start(page.Url); + } catch {} + } else { + System.Windows.MessageBox.Show(lang.GetString(LangKey.upload_success)); + } + return true; + } catch(Exception e) { + System.Windows.MessageBox.Show(lang.GetString(LangKey.upload_failure) + " " + e.Message); } return false; } diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index 1617c2bac..8348cc096 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -141,11 +141,9 @@ namespace GreenshotImgurPlugin { BackgroundForm backgroundForm = BackgroundForm.ShowAndWait(Attributes.Name, lang.GetString(LangKey.communication_wait)); host.SaveToStream(image, stream, config.UploadFormat, config.UploadJpegQuality); - byte[] buffer = stream.GetBuffer(); - try { string filename = Path.GetFileName(host.GetFilename(config.UploadFormat, captureDetails)); - ImgurInfo imgurInfo = ImgurUtils.UploadToImgur(buffer, captureDetails.DateTime.ToString(), filename); + ImgurInfo imgurInfo = ImgurUtils.UploadToImgur(stream.GetBuffer(), (int)stream.Length, captureDetails.DateTime.ToString(), filename); LOG.InfoFormat("Storing imgur upload for hash {0} and delete hash {1}", imgurInfo.Hash, imgurInfo.DeleteHash); config.ImgurUploadHistory.Add(imgurInfo.Hash, imgurInfo.DeleteHash); config.runtimeImgurHistory.Add(imgurInfo.Hash, imgurInfo); @@ -181,10 +179,9 @@ namespace GreenshotImgurPlugin { BackgroundForm backgroundForm = BackgroundForm.ShowAndWait(Attributes.Name, lang.GetString(LangKey.communication_wait)); imageEditor.SaveToStream(stream, config.UploadFormat, config.UploadJpegQuality); - byte [] buffer = stream.GetBuffer(); try { string filename = Path.GetFileName(host.GetFilename(config.UploadFormat, imageEditor.CaptureDetails)); - ImgurInfo imgurInfo = ImgurUtils.UploadToImgur(buffer, imageEditor.CaptureDetails.Title, filename); + ImgurInfo imgurInfo = ImgurUtils.UploadToImgur(stream.GetBuffer(), (int)stream.Length, imageEditor.CaptureDetails.Title, filename); imageEditor.Surface.Modified = false; LOG.InfoFormat("Storing imgur upload for hash {0} and delete hash {1}", imgurInfo.Hash, imgurInfo.DeleteHash); config.ImgurUploadHistory.Add(imgurInfo.Hash, imgurInfo.DeleteHash); diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index 1dbfb1788..7c53fafe0 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -85,11 +85,11 @@ namespace GreenshotImgurPlugin { /// /// byte[] with image data /// ImgurResponse - public static ImgurInfo UploadToImgur(byte[] imageData, string title, string filename) { + public static ImgurInfo UploadToImgur(byte[] imageData, int dataLength, string title, string filename) { StringBuilder uploadRequest = new StringBuilder(); // Add image uploadRequest.Append("image="); - uploadRequest.Append(HttpUtility.UrlEncode(System.Convert.ToBase64String(imageData))); + uploadRequest.Append(HttpUtility.UrlEncode(System.Convert.ToBase64String(imageData, 0, dataLength))); // add key uploadRequest.Append("&"); uploadRequest.Append("key="); diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index 497fc00d5..719c300ef 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -101,25 +101,27 @@ namespace GreenshotJiraPlugin { public override bool ExportCapture(ISurface surface, ICaptureDetails captureDetails) { string filename = Path.GetFileName(jiraPlugin.Host.GetFilename(config.UploadFormat, captureDetails)); + byte[] buffer; if (jira != null) { using (MemoryStream stream = new MemoryStream()) { - BackgroundForm backgroundForm = BackgroundForm.ShowAndWait(Description, lang.GetString(LangKey.communication_wait)); - try { - using (Image image = surface.GetImageForExport()) { - jiraPlugin.Host.SaveToStream(image, stream, config.UploadFormat, config.UploadJpegQuality); - } - byte [] buffer = stream.GetBuffer(); - jiraPlugin.JiraConnector.addAttachment(jira.Key, filename, buffer); - LOG.Debug("Uploaded to Jira."); - backgroundForm.CloseDialog(); - MessageBox.Show(lang.GetString(LangKey.upload_success)); - surface.SendMessageEvent(this, SurfaceMessageTyp.Info, jiraPlugin.Host.CoreLanguage.GetFormattedString("exported_to", Description)); - surface.Modified = false; - return true; - } catch(Exception e) { - backgroundForm.CloseDialog(); - MessageBox.Show(lang.GetString(LangKey.upload_failure) + " " + e.Message); + using (Image image = surface.GetImageForExport()) { + jiraPlugin.Host.SaveToStream(image, stream, config.UploadFormat, config.UploadJpegQuality); } + // COPY stream to buffer + buffer = stream.ToArray(); + } + BackgroundForm backgroundForm = BackgroundForm.ShowAndWait(Description, lang.GetString(LangKey.communication_wait)); + try { + jiraPlugin.JiraConnector.addAttachment(jira.Key, filename, buffer); + LOG.Debug("Uploaded to Jira."); + backgroundForm.CloseDialog(); + MessageBox.Show(lang.GetString(LangKey.upload_success)); + surface.SendMessageEvent(this, SurfaceMessageTyp.Info, jiraPlugin.Host.CoreLanguage.GetFormattedString("exported_to", Description)); + surface.Modified = false; + return true; + } catch (Exception e) { + backgroundForm.CloseDialog(); + MessageBox.Show(lang.GetString(LangKey.upload_failure) + " " + e.Message); } } else { JiraForm jiraForm = new JiraForm(jiraPlugin.JiraConnector); @@ -129,24 +131,24 @@ namespace GreenshotJiraPlugin { DialogResult result = jiraForm.ShowDialog(); if (result == DialogResult.OK) { using (MemoryStream stream = new MemoryStream()) { - BackgroundForm backgroundForm = BackgroundForm.ShowAndWait(Description, lang.GetString(LangKey.communication_wait)); - try { - using (Image image = surface.GetImageForExport()) { - jiraPlugin.Host.SaveToStream(image, stream, config.UploadFormat, config.UploadJpegQuality); - } - - byte [] buffer = stream.GetBuffer(); - jiraForm.upload(buffer); - LOG.Debug("Uploaded to Jira."); - backgroundForm.CloseDialog(); - MessageBox.Show(lang.GetString(LangKey.upload_success)); - surface.SendMessageEvent(this, SurfaceMessageTyp.Info, "Exported to Jira " + jiraForm.getJiraIssue().Key); - surface.Modified = false; - return true; - } catch(Exception e) { - backgroundForm.CloseDialog(); - MessageBox.Show(lang.GetString(LangKey.upload_failure) + " " + e.Message); + using (Image image = surface.GetImageForExport()) { + jiraPlugin.Host.SaveToStream(image, stream, config.UploadFormat, config.UploadJpegQuality); } + // COPY stream to buffer + buffer = stream.ToArray(); + } + BackgroundForm backgroundForm = BackgroundForm.ShowAndWait(Description, lang.GetString(LangKey.communication_wait)); + try { + jiraForm.upload(buffer); + LOG.Debug("Uploaded to Jira."); + backgroundForm.CloseDialog(); + MessageBox.Show(lang.GetString(LangKey.upload_success)); + surface.SendMessageEvent(this, SurfaceMessageTyp.Info, "Exported to Jira " + jiraForm.getJiraIssue().Key); + surface.Modified = false; + return true; + } catch(Exception e) { + backgroundForm.CloseDialog(); + MessageBox.Show(lang.GetString(LangKey.upload_failure) + " " + e.Message); } } }