FEATURE-838: Added support for dragging an image from google image search results directly into the editor.

This commit is contained in:
Robin 2015-04-15 13:59:36 +02:00
parent ea8c27449f
commit 5d8ad4d021
2 changed files with 53 additions and 7 deletions

View file

@ -86,6 +86,26 @@ namespace GreenshotPlugin.Core {
return null;
}
/// <summary>
/// Download the uri into a memorystream, without catching exceptions
/// </summary>
/// <param name="url">Of an image</param>
/// <returns>MemoryStream which is already seeked to 0</returns>
public static MemoryStream GetAsMemoryStream(string url) {
HttpWebRequest request = CreateWebRequest(url);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
MemoryStream memoryStream = new MemoryStream();
using (Stream responseStream = response.GetResponseStream()) {
if (responseStream != null) {
responseStream.CopyTo(memoryStream);
}
// Make sure it can be used directly
memoryStream.Seek(0, SeekOrigin.Begin);
}
return memoryStream;
}
}
/// <summary>
/// Download the uri to Bitmap
/// </summary>
@ -93,15 +113,27 @@ namespace GreenshotPlugin.Core {
/// <returns>Bitmap</returns>
public static Image DownloadImage(string url) {
try {
HttpWebRequest request = CreateWebRequest(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (request.HaveResponse) {
using (Stream responseStream = response.GetResponseStream()) {
if (responseStream != null) {
using (Image image = Image.FromStream(responseStream)) {
return ImageHelper.Clone(image, PixelFormat.Format32bppArgb);
string content;
using (MemoryStream memoryStream = GetAsMemoryStream(url)) {
try {
using (Image image = Image.FromStream(memoryStream)) {
return ImageHelper.Clone(image, PixelFormat.Format32bppArgb);
}
} catch (Exception) {
// If we arrive here, the image loading didn't work, try to see if the response has a http(s) URL to an image and just take this instead.
using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8, true)) {
content = streamReader.ReadLine();
}
Regex imageUrlRegex = new Regex(@"(http|https)://.*(\.png|\.gif|\.jpg|\.tiff|\.jpeg|\.bmp)");
Match match = imageUrlRegex.Match(content);
if (match.Success) {
using (MemoryStream memoryStream2 = GetAsMemoryStream(match.Value)) {
using (Image image = Image.FromStream(memoryStream2)) {
return ImageHelper.Clone(image, PixelFormat.Format32bppArgb);
}
}
}
throw;
}
}
} catch (Exception e) {

View file

@ -148,5 +148,19 @@ namespace GreenshotPlugin.Core {
return returnValue;
}
/// <summary>
/// Read "streamextensions" :)
/// </summary>
/// <param name="input">Stream</param>
/// <param name="output">Stream</param>
public static void CopyTo(this Stream input, Stream output) {
byte[] buffer = new byte[16 * 1024]; // Fairly arbitrary size
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) {
output.Write(buffer, 0, bytesRead);
}
}
}
}