mirror of
https://github.com/greenshot/greenshot
synced 2025-08-22 06:23:24 -07:00
Update
This commit is contained in:
parent
4ff9f2a0ec
commit
33dd2b7a27
2 changed files with 62 additions and 41 deletions
|
@ -1803,5 +1803,49 @@ namespace Greenshot.Base.Core
|
|||
|
||||
return returnImage;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Rotate the image
|
||||
/// </summary>
|
||||
/// <param name="image">Input image</param>
|
||||
/// <param name="rotationAngle">Angle in degrees</param>
|
||||
/// <returns>Rotated image</returns>
|
||||
public static Image Rotate(this Image image, float rotationAngle)
|
||||
{
|
||||
var bitmap = new Bitmap(image.Width, image.Height);
|
||||
|
||||
using var gfx = Graphics.FromImage(bitmap);
|
||||
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||
|
||||
gfx.TranslateTransform((float)bitmap.Width / 2, (float)bitmap.Height / 2);
|
||||
gfx.RotateTransform(rotationAngle);
|
||||
gfx.TranslateTransform(-(float)bitmap.Width / 2, -(float)bitmap.Height / 2);
|
||||
|
||||
gfx.DrawImage(image, new Point(0, 0));
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a bitmap from a WPF bitmap source
|
||||
/// </summary>
|
||||
/// <param name="bitmapSource"></param>
|
||||
/// <returns>Winforms bitmap</returns>
|
||||
public static Bitmap ToBitmap(this System.Windows.Media.Imaging.BitmapSource bitmapSource)
|
||||
{
|
||||
var src = new System.Windows.Media.Imaging.FormatConvertedBitmap();
|
||||
src.BeginInit();
|
||||
src.Source = bitmapSource;
|
||||
src.DestinationFormat = System.Windows.Media.PixelFormats.Bgra32;
|
||||
src.EndInit();
|
||||
|
||||
var bitmap = new Bitmap(src.PixelWidth, src.PixelHeight, PixelFormat.Format32bppArgb);
|
||||
var data = bitmap.LockBits(new Rectangle(new Point(0, 0), bitmap.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
|
||||
src.CopyPixels(System.Windows.Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
|
||||
bitmap.UnlockBits(data);
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -31,6 +31,7 @@ using System.Windows.Forms.Integration;
|
|||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Emoji.Wpf;
|
||||
using Greenshot.Base.Core;
|
||||
using Greenshot.Base.Interfaces.Drawing;
|
||||
using Greenshot.Editor.Helpers;
|
||||
using Image = System.Drawing.Image;
|
||||
|
@ -182,59 +183,35 @@ namespace Greenshot.Editor.Drawing
|
|||
var rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height);
|
||||
|
||||
var iconSize = Math.Min(rect.Width, rect.Height);
|
||||
|
||||
if (iconSize > 0)
|
||||
{
|
||||
_image.Measure(new Size(iconSize, iconSize));
|
||||
_image.Arrange(new Rect(0, 0, iconSize, iconSize));
|
||||
|
||||
var renderTargetBitmap = new RenderTargetBitmap(iconSize, iconSize, 96, 96, PixelFormats.Pbgra32);
|
||||
renderTargetBitmap.Render(_image);
|
||||
|
||||
using var bitmap = BitmapFromSource(renderTargetBitmap);
|
||||
|
||||
if (_rotationAngle != 0)
|
||||
{
|
||||
using var newBitmap = RotateImage(bitmap, _rotationAngle);
|
||||
graphics.DrawImage(newBitmap, Bounds);
|
||||
return;
|
||||
}
|
||||
|
||||
using var bitmap = GetBitmap(iconSize);
|
||||
graphics.DrawImage(bitmap, Bounds);
|
||||
}
|
||||
}
|
||||
|
||||
private Bitmap BitmapFromSource(BitmapSource bitmapSource)
|
||||
private Image GetBitmap(int iconSize)
|
||||
{
|
||||
var src = new FormatConvertedBitmap();
|
||||
src.BeginInit();
|
||||
src.Source = bitmapSource;
|
||||
src.DestinationFormat = PixelFormats.Bgra32;
|
||||
src.EndInit();
|
||||
_image.Measure(new Size(iconSize, iconSize));
|
||||
_image.Arrange(new Rect(0, 0, iconSize, iconSize));
|
||||
|
||||
var bitmap = new Bitmap(src.PixelWidth, src.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||
var data = bitmap.LockBits(new Rectangle(new Point(0, 0), bitmap.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||
src.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
|
||||
bitmap.UnlockBits(data);
|
||||
var renderTargetBitmap = new RenderTargetBitmap(iconSize, iconSize, 96, 96, PixelFormats.Pbgra32);
|
||||
renderTargetBitmap.Render(_image);
|
||||
|
||||
var bitmap = renderTargetBitmap.ToBitmap();
|
||||
|
||||
if (_rotationAngle != 0)
|
||||
{
|
||||
var newBitmap = bitmap.Rotate( _rotationAngle);
|
||||
bitmap.Dispose();
|
||||
|
||||
return newBitmap;
|
||||
}
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
private static Image RotateImage(Image img, float rotationAngle)
|
||||
{
|
||||
var bitmap = new Bitmap(img.Width, img.Height);
|
||||
|
||||
using var gfx = Graphics.FromImage(bitmap);
|
||||
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||
|
||||
gfx.TranslateTransform((float)bitmap.Width / 2, (float)bitmap.Height / 2);
|
||||
gfx.RotateTransform(rotationAngle);
|
||||
gfx.TranslateTransform(-(float)bitmap.Width / 2, -(float)bitmap.Height / 2);
|
||||
|
||||
gfx.DrawImage(img, new Point(0, 0));
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
|
||||
internal static class PickerExtensions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue