naps2/NAPS2.Images.Wpf/WpfImageTransformer.cs
2023-12-25 07:46:44 -08:00

62 lines
2.5 KiB
C#

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace NAPS2.Images.Wpf;
public class WpfImageTransformer : AbstractImageTransformer<WpfImage>
{
public WpfImageTransformer(ImageContext imageContext) : base(imageContext)
{
}
protected override WpfImage PerformTransform(WpfImage image, RotationTransform transform)
{
var width = image.Width;
var height = image.Height;
float xres = image.HorizontalResolution, yres = image.VerticalResolution;
if (transform.Angle is > 45.0 and < 135.0 or > 225.0 and < 315.0)
{
(width, height) = (height, width);
(xres, yres) = (yres, xres);
}
var visual = new DrawingVisual();
using (var dc = visual.RenderOpen())
{
dc.DrawRectangle(Brushes.White, null, new Rect(0, 0, width, height));
dc.PushTransform(new TranslateTransform(width / 2.0, height / 2.0));
dc.PushTransform(new RotateTransform(transform.Angle));
dc.PushTransform(new TranslateTransform(-image.Width / 2.0, -image.Height / 2.0));
dc.DrawImage(image.Bitmap, new Rect(0, 0, image.Width, image.Height));
}
var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
rtb.Render(visual);
var newImage = new WpfImage(ImageContext, new WriteableBitmap(rtb));
// TODO: In Gdi, we convert this back to BW1 (or the original pixel format). Should we do the same?
newImage.LogicalPixelFormat = image.LogicalPixelFormat == ImagePixelFormat.BW1
? ImagePixelFormat.Gray8
: image.LogicalPixelFormat;
newImage.SetResolution(xres, yres);
image.Dispose();
return newImage;
}
protected override WpfImage PerformTransform(WpfImage image, ResizeTransform transform)
{
var copy = new TransformedBitmap(image.Bitmap,
new System.Windows.Media.ScaleTransform(transform.Width / (double) image.Width,
transform.Height / (double) image.Height));
var newImage = new WpfImage(ImageContext, new WriteableBitmap(copy));
newImage.LogicalPixelFormat = image.LogicalPixelFormat == ImagePixelFormat.BW1
? ImagePixelFormat.Gray8
: image.LogicalPixelFormat;
newImage.SetResolution(
image.HorizontalResolution * image.Width / transform.Width,
image.VerticalResolution * image.Height / transform.Height);
image.Dispose();
return newImage;
}
}