diff --git a/ShareX.HelpersLib/Helpers/ImageHelpers.cs b/ShareX.HelpersLib/Helpers/ImageHelpers.cs index 39d504c4e..81d3b4ec2 100644 --- a/ShareX.HelpersLib/Helpers/ImageHelpers.cs +++ b/ShareX.HelpersLib/Helpers/ImageHelpers.cs @@ -34,7 +34,7 @@ You should have received a copy of the GNU General Public License using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; -using Encoder = System.Drawing.Imaging.Encoder; +using System.Windows.Media.Imaging; namespace ShareX.HelpersLib { @@ -76,6 +76,42 @@ public static Bitmap ResizeImage(Bitmap bmp, Size size, InterpolationMode interp return ResizeImage(bmp, size.Width, size.Height, interpolationMode); } + public static Bitmap ScaleImageFast(Bitmap bmp, double scale) + { + return ScaleImageFast(bmp, scale, scale); + } + + public static Bitmap ScaleImageFast(Bitmap bmp, double scaleX, double scaleY) + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmp.Save(memoryStream, ImageFormat.Bmp); + + BitmapImage bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.StreamSource = memoryStream; + bitmapImage.EndInit(); + + TransformedBitmap transformedBitmap = new TransformedBitmap(); + transformedBitmap.BeginInit(); + transformedBitmap.Source = bitmapImage; + transformedBitmap.Transform = new System.Windows.Media.ScaleTransform(scaleX, scaleY); + transformedBitmap.EndInit(); + + return GetBitmap(transformedBitmap, bmp.PixelFormat); + } + } + + private static Bitmap GetBitmap(BitmapSource bitmapSource, PixelFormat pixelFormat = PixelFormat.Format32bppArgb) + { + Bitmap bmp = new Bitmap(bitmapSource.PixelWidth, bitmapSource.PixelHeight, pixelFormat); + BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, pixelFormat); + bitmapSource.CopyPixels(System.Windows.Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); + bmp.UnlockBits(data); + return bmp; + } + public static Bitmap ResizeImage(Bitmap bmp, Size size, bool allowEnlarge, bool centerImage = true) { return ResizeImage(bmp, size.Width, size.Height, allowEnlarge, centerImage); @@ -2917,7 +2953,7 @@ public static void SaveJPEG(Image img, Stream stream, int quality) using (EncoderParameters encoderParameters = new EncoderParameters(1)) { - encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); + encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); img.Save(stream, ImageFormat.Jpeg.GetCodecInfo(), encoderParameters); } } diff --git a/ShareX.HelpersLib/ShareX.HelpersLib.csproj b/ShareX.HelpersLib/ShareX.HelpersLib.csproj index a95a627e2..0a180933e 100644 --- a/ShareX.HelpersLib/ShareX.HelpersLib.csproj +++ b/ShareX.HelpersLib/ShareX.HelpersLib.csproj @@ -86,6 +86,7 @@ + @@ -99,6 +100,7 @@ + diff --git a/ShareX/Tools/OCR/OCRHelper.cs b/ShareX/Tools/OCR/OCRHelper.cs index 466bef95a..b112efa72 100644 --- a/ShareX/Tools/OCR/OCRHelper.cs +++ b/ShareX/Tools/OCR/OCRHelper.cs @@ -64,8 +64,7 @@ public static void ThrowIfNotSupported() { if (!IsSupported) { - throw new Exception(string.Format(Resources.OpticalCharacterRecognitionFeatureIsOnlyAvailableWithWindowsVersion0OrNewer, - SupportedVersion)); + throw new Exception(string.Format(Resources.OpticalCharacterRecognitionFeatureIsOnlyAvailableWithWindowsVersion0OrNewer, SupportedVersion)); } } @@ -77,8 +76,7 @@ public static async Task OCR(Bitmap bmp, string languageTag = "en", floa return await Task.Run(async () => { - using (Bitmap bmpClone = (Bitmap)bmp.Clone()) - using (Bitmap bmpScaled = ImageHelpers.ResizeImage(bmpClone, (int)(bmpClone.Width * scaleFactor), (int)(bmpClone.Height * scaleFactor))) + using (Bitmap bmpScaled = ImageHelpers.ScaleImageFast(bmp, scaleFactor)) { return await OCRInternal(bmpScaled, languageTag, singleLine); }