diff --git a/FinalShot/FinalShot.cs b/FinalShot/FinalShot.cs index 93484ea..c312ca6 100644 --- a/FinalShot/FinalShot.cs +++ b/FinalShot/FinalShot.cs @@ -2,6 +2,7 @@ using System.Drawing; using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Windows.Forms; using Rainmeter; @@ -30,9 +31,10 @@ public static void Log(string message) internal class Measure { private string savePath; - private string finishAction = ""; - private Rainmeter.API api; - public static bool showCursor; + private string finishAction = ""; + private Rainmeter.API api; + public static bool showCursor; + public static int jpegQuality; private int predefX; private int predefY; private int predefWidth; @@ -70,6 +72,7 @@ public void Reload(Rainmeter.API api, ref double maxValue) savePath = api.ReadString("SavePath", ""); finishAction = api.ReadString("ScreenshotFinishAction", ""); showCursor = api.ReadInt("ShowCursor", 0) > 0; + jpegQuality = api.ReadInt("JpgQuality", 70); predefX = api.ReadInt("PredefX", 0); predefY = api.ReadInt("PredefY", 0); predefWidth = api.ReadInt("PredefWidth", 0); @@ -190,13 +193,42 @@ private void SaveImage(Bitmap bitmap) { try { - bitmap.Save(savePath, ImageFormat.Png); - Logger.Log("Image saved to: " + savePath); + ImageFormat format = GetImageFormat(savePath); + + if (format.Equals(ImageFormat.Jpeg)) + { + var encoder = ImageCodecInfo.GetImageEncoders().FirstOrDefault(c => c.FormatID == ImageFormat.Jpeg.Guid); + var encoderParams = new EncoderParameters(1); + encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, Measure.jpegQuality); + bitmap.Save(savePath, encoder, encoderParams); + } + else + { + bitmap.Save(savePath, format); + } } catch (Exception ex) { - api.Log(API.LogType.Error, "Error saving image: " + ex.Message); - Logger.Log("Error saving image: " + ex.Message); + Logger.Log("Error saving custom screenshot: " + ex.Message); + } + } + + private ImageFormat GetImageFormat(string path) + { + string ext = Path.GetExtension(path).ToLowerInvariant(); + switch (ext) + { + case ".jpg": + case ".jpeg": + return ImageFormat.Jpeg; + case ".png": + return ImageFormat.Png; + case ".bmp": + return ImageFormat.Bmp; + case ".tiff": + return ImageFormat.Tiff; + default: + return ImageFormat.Png; // fallback } } @@ -237,7 +269,6 @@ public CustomScreenshotForm(string savePath, Action finishAction) this.Cursor = Cursors.Cross; this.StartPosition = FormStartPosition.Manual; this.Location = SystemInformation.VirtualScreen.Location; - this.MouseDown += OnMouseDown; this.MouseMove += OnMouseMove; this.MouseUp += OnMouseUp; @@ -379,15 +410,24 @@ private void SaveImage(Bitmap bitmap) try { ImageFormat format = GetImageFormat(savePath); - bitmap.Save(savePath, format); - Logger.Log("Custom screenshot saved to: " + savePath); + + if (format.Equals(ImageFormat.Jpeg)) + { + var encoder = ImageCodecInfo.GetImageEncoders().FirstOrDefault(c => c.FormatID == ImageFormat.Jpeg.Guid); + var encoderParams = new EncoderParameters(1); + encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, Measure.jpegQuality); + bitmap.Save(savePath, encoder, encoderParams); + } + else + { + bitmap.Save(savePath, format); + } } catch (Exception ex) { Logger.Log("Error saving custom screenshot: " + ex.Message); } } - private ImageFormat GetImageFormat(string path) { string ext = Path.GetExtension(path).ToLowerInvariant();