This repository has been archived on 2017-12-27. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
ScreenCapture/ScreenCapture.cs
2015-09-27 12:13:23 +02:00

123 lines
3.7 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using static ScreenCapture.NativeMethods;
namespace ScreenCapture
{
sealed class ScreenCapture
{
#region Singleton
private static ScreenCapture instance;
public static ScreenCapture Instance
{
get
{
instance = instance ?? new ScreenCapture();
return instance;
}
}
#endregion
private readonly static EncoderParameters encParamsJPG = new EncoderParameters();
private readonly static ImageCodecInfo codecJPG = GetEncoderInfo(ImageFormat.Jpeg);
private readonly static ImageCodecInfo codecPNG = GetEncoderInfo(ImageFormat.Png);
public string FileName { get; private set; }
public MemoryStream Stream { get; private set; }
private ScreenCapture()
{
encParamsJPG.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L);
}
public void CaptureWindow()
{
Capture(CurrentWindow);
}
public void Release()
{
Stream.Close();
Stream.Dispose();
FileName = null;
}
private Rectangle CurrentWindow
{
get
{
IntPtr window = GetForegroundWindow();
Rect rect = new Rect();
GetWindowRect(window, ref rect);
StringBuilder sb = new StringBuilder(255);
GetWindowText(window, sb, sb.Capacity);
FileName = sanitizeFileName(sb.ToString()) + "_" + DateTime.Now.Ticks + ".";
return new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);
}
}
private void Capture(Rectangle bounds)
{
using (Bitmap image = new Bitmap(bounds.Width, bounds.Height))
{
using (Graphics g = Graphics.FromImage(image))
{
g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
}
Stream = BestStream(image);
Stream.Seek(0, SeekOrigin.Begin);
}
}
private MemoryStream BestStream(Bitmap image)
{
MemoryStream png = WriteToMemory(image, codecPNG, null);
MemoryStream jpg = WriteToMemory(image, codecJPG, encParamsJPG);
if (png.Length <= jpg.Length)
{
FileName += "png";
jpg.Close();
jpg.Dispose();
return png;
}
else
{
FileName += "jpg";
png.Close();
png.Dispose();
return jpg;
}
}
private static MemoryStream WriteToMemory(Bitmap image, ImageCodecInfo imageCodeInfo, EncoderParameters encoderParam)
{
MemoryStream mt = new MemoryStream();
image.Save(mt, imageCodeInfo, encoderParam);
return mt;
}
private static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
return ImageCodecInfo.GetImageEncoders().First(codec =>
{
return codec.FormatID == format.Guid;
});
}
private static string sanitizeFileName(string str)
{
return Regex.Replace(String.Join("_", str.Split(Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.'), @"[^\u0000-\u007F]", string.Empty);
}
}
}